1
_declspec(align(32)) struct St{ 
    int foo; 
};
typedef std::aligned_storage<sizeof(St), std::alignment_of<St>::value>::type Ta;

int main() {
    std::cout << std::alignment_of<St>::value << '\n'; 
    std::cout << std::alignment_of<Ta>::value << '\n';
    return 0;
}

出力は次のとおりです。

32
8

msvc(visual studio 2012)を使用しています。整列は 32ですかTa、それとも 8 だけですか?

4

2 に答える 2

3

VS2012max_align_tでは 8 です。これは、すべてのコンテキストでサポートされる最大アライメントが 8 であることを意味します。この値より大きいアライメントは「拡張アライメント」であり、

拡張アラインメントがサポートされているかどうか、およびそれらがサポートされているコンテキストは、実装によって定義されます。

[basic.align] 3.11/3

Microsoft のアラインメント指定子は拡張アラインメントを許可しますが、使用している標準ライブラリの実装ではサポートされていません。これは不適合ではないように見えますが、QoI の問題のように思えます。

于 2013-03-18T16:12:19.210 に答える
2

struct alignas(32) St{を置き換えることで、あなたの例を標準の C++11 に翻訳しました_declspec(align(32)) struct St{

次に、システム(clang ++ / libc ++)OS Xで実行しました。結果は次のとおりです。

32
32

St32 を 16 または 64 に変更すると、 と の両方で引き続き同じアライメントが得られTaます。これは、使用している実装のバグであると思われます。

于 2013-03-17T15:57:48.047 に答える