2012-03-28 22 views
6

Tôi tò mò về sự liên kết của các loại uint32_t trên nền tảng 64 bit. Spec nói rằng uint32_t nên chính xác bitwidth nhất định, mà thực sự nó có vẻ là:liên kết uint32_t trên 64 bit?

> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t)); 
sizeof(uint32_t): 4 

Nhưng sau đó tôi có một cấu trúc:

typedef struct A { 
    uint32_t a; 
    uint32_t b; 
} A; 

Nhưng, đáng ngạc nhiên:

> printf("sizeof(A): %zd\n", sizeof(A)); 
sizeof(A): 16 

Uint32_t có được liên kết 8 byte vì một lý do nào đó không? Nó thực sự là một loại 8-byte bên dưới?

+1

Trình biên dịch là gì và kiến ​​trúc là gì? – ouah

+1

gcc 4.4.5 trên x86-64 –

+0

Lưu ý rằng do cách mảng hoạt động, yêu cầu căn chỉnh của 'uint32_t' * phải * nhỏ hơn hoặc bằng' sizeof (uint32_t) '. Do yêu cầu không có đệm trong các loại 'uintN_t',' sizeof (uint32_t) * CHAR_BIT == 32'. Mọi thứ khác không phù hợp với C99. Tuy nhiên, sự liên kết của 'struct A' của bạn được C99 cho phép là lớn hơn sự liên kết lớn nhất của bất kỳ thành viên nào. –

Trả lời

6

Nó hoàn toàn phụ thuộc vào trình biên dịch và kiến ​​trúc của bạn. Trong trường hợp của bạn, có vẻ như các trường thực sự được liên kết 8 byte, có lẽ vì lý do hiệu suất.

2

Tôi đoán là theo mặc định mọi thứ trên kiến ​​trúc 64 bit sẽ được căn chỉnh với các đường biên 64 bit giống như trên kiến ​​trúc 32bit, mọi thứ được căn chỉnh với 4 byte. Bạn có thể chỉ định đóng gói pragma chỉ thị để thoát khỏi padding. Ví dụ:

#pragma pack(0) 

trong gcc.

+0

Kỳ lạ, nếu tôi đóng gói (1), thì trường hợp cấu trúc hai phần tử ở trên vẫn mang lại cho tôi 16, nhưng nếu tôi thêm một uint32_t vào nó, tôi nhận được 20 ... khó hiểu –

Các vấn đề liên quan