this questionユニオンのアライメントは、それが個々のメンバーの最大のアライメントよりも小さくないと信じ始める可能性があります。しかし、gcc/g ++のlong long
タイプに問題があります。完全な例はhere見つけましたが、ここで私の質問に関連する部分であり、することができます。これは、次のような出力になりなぜ長いlong unionメンバのアライメントがcontains union/structよりも大きいのですか?これは正しいです?
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
よりもメンバー大きな労働組合の整列があるのはなぜ含有組合の?
は[UPDATE]
alignofキースの答えによると、ここで間違っています。しかし、私は次のことを試してみると、それはのalignofが真実を教えてくれるようです。参照:
union ull {
long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(size_t((void*)&b));
pr(size_t((void*)&c));
pr(size_t((void*)&d));
pr(size_t((void*)&e));
pr(size_t((void*)&c) - size_t((void*)&b));
pr(size_t((void*)&e) - size_t((void*)&d));
};
出力:
size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4
したがって、long long
のアラインメントは8とlong long
を含む組合のアラインメントは、グローバルデータ4です。ローカルスコープについては、コンパイラがローカルデータを自由に並べ替えることができるように見えるので、これをテストすることはできません。このトリックは機能しません。これについてコメントできますか?
[/ UPDATE]
gcc 4.7.0では '-m32'と同じことが見られますが、' -m64'では(すべて '8'sで)*ではありません。 – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 _Alignof(C11)の対応するgccバグへのリンク。 –