从这个问题可以开始相信工会的联盟不小于其个人成员的最大联盟。但我对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,包含联合的对齐long long
为 4。对于本地范围,我无法对此进行测试,因为编译器似乎可以自由地重新排列本地数据 - 所以这个技巧不起作用。你能对此发表评论吗?
[/更新]