2009-12-03 46 views
35

thể trùng lặp:
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?kích thước của struct trong C

xem xét mã C sau:

#include <stdio.h>  

struct employee 
{ 
    int id; 
    char name[30]; 
}; 

int main() 
{ 
    struct employee e1;  
    printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1)); 
    return(0); 
} 

Đầu ra là:

Tại sao kích thước của cấu trúc không bằng tổng của các kích thước của các biến thành phần riêng lẻ của nó?

+1

Bạn có thể sử dụng thuộc tính được đóng gói trong gcc .. Điều này sẽ giảm tỷ lệ đệm và giữ cấu trúc càng nhỏ càng tốt. struct test_t { int c; } __attribute __ ((__ packed__)); – eaanon01

+0

Bản sao của (ít nhất) http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member – dmckee

+6

eaanon01 . bạn không nên nói với ai về thứ gì đó không thể chuyển nhượng như thuộc tính được đóng gói trừ khi có một lý do thực sự tốt và tất cả các hàm ý đều được hiểu. –

Trả lời

52

Trình biên dịch có thể thêm phần đệm cho các yêu cầu căn chỉnh. Lưu ý rằng điều này không chỉ áp dụng cho việc đệm giữa các trường của một cấu trúc, mà còn có thể áp dụng cho phần cuối của cấu trúc (do đó các mảng của kiểu cấu trúc sẽ có mỗi phần tử được căn chỉnh đúng).

Ví dụ:

struct foo_t { 
    int x; 
    char c; 
}; 

Mặc dù lĩnh vực c không cần đệm, các cấu trúc sẽ thường có một (trên một hệ thống 32-bit sizeof(struct foo_t) == 8 - chứ không phải một hệ thống với 32-bit int loại) vì sẽ cần phải có 3 byte đệm sau trường c.

Lưu ý rằng đệm có thể không được yêu cầu bởi hệ thống (như x86 hoặc Cortex M3) nhưng trình biên dịch vẫn có thể thêm nó vì lý do hiệu suất.

+1

+1, mặc dù căn chỉnh với 6 byte âm thanh lạ. Có lẽ tôi là một chút phía sau trong công cụ cấp thấp, mặc dù. –

+1

Vâng, tên bắt đầu tại bù đắp 4 (đủ chính đáng) và kéo dài đến 34. 34 không phải là bội số của 4 vì vậy nó kết thúc đệm đến 36, đó là 9 * 4. Có nghĩa với tôi! –

+2

Sắp xếp của nó với ranh giới 32 bit (4,8,16,24,32,36, ...) – Mordachai

0

Hiệu chỉnh đến 6 byte không phải là lạ, bởi vì nó được sắp xếp đến các địa chỉ nhiều đến 4.

Vì vậy, về cơ bản bạn có 34 byte trong cấu trúc của bạn và cấu trúc tiếp theo nên được đặt trên địa chỉ, đó là nhiều để 4. Giá trị gần nhất sau 34 là 36. Và vùng đệm này được tính vào kích thước của cấu trúc.

2

Như đã đề cập, trình biên dịch C sẽ thêm phần đệm cho các yêu cầu căn chỉnh. Những yêu cầu này thường phải làm với hệ thống con bộ nhớ. Một số loại máy tính chỉ có thể truy cập bộ nhớ xếp hàng với một số giá trị 'đẹp', như 4 byte. Điều này thường giống với độ dài từ. Do đó, trình biên dịch C có thể sắp xếp các trường trong cấu trúc của bạn với giá trị này để dễ truy cập hơn (ví dụ, 4 giá trị byte phải được căn chỉnh 4 byte) Hơn nữa, nó có thể đệm phần dưới của cấu trúc để sắp xếp dữ liệu theo cấu trúc . Tôi tin rằng có những lý do khác nữa. Bạn có thể tìm thêm thông tin tại this trang wikipedia.

1

Căn chỉnh mặc định của bạn có thể là 4 byte. Phần tử 30 byte có 32 hoặc toàn bộ cấu trúc được làm tròn thành khoảng thời gian 4 byte tiếp theo.

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