C++ 11では、変数の配置を指定するためにalignas
specifierが導入され、型のデフォルトの配置を照会するためにalignof
operatorが導入されました。しかし、私は特定の変数のアライメントを得る方法はありません。のは、以下の簡単な例を見てみましょう:ここ特定の変数の配置の照会
alignas(16) float* array;
は、我々はそれについて何ができるかです:私たちは何をしたい明らかではありません
alignof(float*)
戻り8、。alignof(array)
は正確に私たちが望むものですが、これはコンパイラ拡張です。標準で指定されたalignof
は、特定の変数で使用することはできません。alignof(decltype(array))
は8を返します。これはかなり期待されていましたが、私たちが望むものではありませんでした。std::alignment_of
はalignof
で実装されているため、あまり役に立ちません。
特定の変数array
が16バイトの境界に位置合わせされていることを確認するメカニズムが必要です。このようなクエリを実行するための標準はありますか?
bool is_aligned(const volatile void *p, std::size_t n)
{
return reinterpret_cast<std::uintptr_t>(p) % n == 0;
}
assert(is_aligned(array, 16));
は、上記のフラットなアドレス空間を想定し、uintptr_t
上の算術char *
上の算術と同等です:
* alignof *はそれを提供する必要はありません - コンパイル時に最低限の契約を返します* - 実行時に値*を必要とする*。特定の変数は、ページ境界*、メガバイト境界、または実行時の何らかのもの(つまり、約束されているか要求されているよりも「良い」)に非常によく揃えられます。変数のアドレスを取得し、必要なアライメント値で均等に割り切れることを確認します。 – tofro
@tofro右、それを指定するのを忘れていましたが、変数名に使用されたときにランタイムになるために半分の期待された 'alignof'がありました(私はこれがコンパイラの拡張機能です)。コンパイル時にすべてがわかるとは思っていませんでした。 – Morwenn
*#ALIGNED8(x)((&(x)&& 0x7)== 0)*があなたの目的に合致しないのか、標準がこの単純な構造を複製するものでなければならないのか、 – tofro