この質問から、組合の調整は、その個々のメンバーの最大の調整以上であると信じ始めることができます。しかしlong long
、gcc /g++の型に問題があります。完全な例はここにありますが、私の質問に関連する部分は次のとおりです。
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
組合員の配置が、それを含む組合の配置よりも大きいのはなぜですか?
[アップデート]
キースの答えによると、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であり、ユニオンを含むアラインメントは4です。long long
ローカルスコープの場合、コンパイラはローカルデータを自由に再配置できるように見えるため、これをテストすることはできません。したがって、このトリックは機能しません。これについてコメントできますか?
[/アップデート]