Từ this question người ta có thể bắt đầu tin rằng sự liên kết của một công đoàn không nhỏ hơn sự liên kết lớn nhất của các thành viên riêng lẻ. Nhưng tôi gặp sự cố với loại long long
trong gcc/g ++. Các ví dụ đầy đủ có thể được tìm thấy here, nhưng đây là những phần có liên quan cho câu hỏi của tôi:Tại sao việc căn chỉnh thành viên công đoàn dài dài lớn hơn công đoàn/cấu trúc có chứa? Điều này có đúng không?
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));
};
Điều này dẫn đến kết quả như sau:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
Tại sao là sự liên kết của một thành viên đoàn lớn hơn mà của công đoàn có chứa?
[UPDATE]
Theo Keith của câu trả lời alignof là sai ở đây. Nhưng tôi thử nghiệm những điều sau và có vẻ như là alignof cho chúng ta biết sự thật. Xem:
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));
};
Sản lượng:
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
Vì vậy, sự liên kết của long long
kiến 8 và sự liên kết của công đoàn chứa long long
là 4 trong dữ liệu toàn cầu. Đối với phạm vi địa phương tôi không thể kiểm tra điều này vì có vẻ như trình biên dịch được tự do sắp xếp lại dữ liệu cục bộ - vì vậy mẹo này không hoạt động. Bạn có thể nhận xét về nó không?
[/ UPDATE]
Tôi thấy điều tương tự trên Red Hat, gcc 4.7.0 với '-m32', nhưng * không * với' -m64' (tất cả '8'). – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 liên kết đến lỗi gcc tương ứng cho _Alignof (C11). –