Kích thước của struct theo lý thuyết nó sẽ là kích thước tổng cộng của các dữ liệu thành viên. Tuy nhiên, theo cách thức tổ chức bộ nhớ, các dữ liệu thành viên của một struct sẽ được sắp xếp liền kề nhau. Việc tổ chức bộ nhớ của hệ thống máy tính 32bit sẽ theo xu hướng là nhóm 4 bytes. Điều này có nghĩa là, nếu dữ liệu thành viên thứ nhất đã lấp vào một số byte bộ nhớ, và nếu còn thừa, thì hệ điều hành sẽ xem xét để đưa dữ liệu thành viên tiếp theo vào. Nếu dữ liệu thành viên tiếp theo chiếm một số lượng các byte bộ nhớ còn thừa, thì nó sẽ được lấp vào phần bộ nhớ còn thừa đó. Nhưng nếu vượt quá, thì hệ thống sẽ được định hướng bổ sung thêm một nhóm 4 byte bộ nhớ mới để chứa dữ liệu thành viên tiếp theo (nếu cần nhiều hơn thì cung cấp tiếp nhóm 4 byte nữa). Còn đối với số byte còn thừa, nó vẫn được để trống.
Ví dụ 1 Ví dụ 2
struct number{ char a;
struct number{ char a;
C + + int b; char c; }mynum; … cout<<sizeof(mynum); //12 char c; int b; }mynum; … cout<<sizeof(mynum); //8 Giải thích: Trong ví dụ 1: char – 1byte int – 4byte
Đầu tiên, dữ liệu thành viên char sẽ lấp đầy nhóm 4byte, char chiếm 1byte nên còn thừa 3 byte. Dữ liệu thành viên tiếp theo là int. Vì int chiếm 4byte, nhưng chỉ thừa có 3 byte, nó không đủ chỗ cho int. Do đó, hệ thống sẽ tự động cung cấp thêm 3 byte để lấp đầy phần còn thừa. Tiếp theo, sẽ cung cấp nhóm 4 byte cho int. Không có byte thừa trong trường hợp này. Kiểu dữ liệu thành viên char còn lại chiếm 1byte, nhưng hệ thống cung cấp cho nó 4 byte, còn thừa 3 byte. Số byte thừa này sẽ được lấp đầy. Như vậy, số byte
trong trường hợp này là
(1+3)+4+(1+3)=12 byte.
Trong ví dụ 2:
Cũng tương tự ví dụ 1. Dữ liệu thành viên char thứ nhất chiếm 1 byte, hệ thống cung cấp 4 byte, như vậy thừa 3 byte. Kiểu dữ liệu thành viên tiếp theo cũng kiểu char, chiếm 1byte, nó có thể lấp vào số byte còn thừa. Tại thời điểm này, còn thừa 2 byte. Tiếp theo, ta xét đến dữ liệu thành viên int. Dữ liệu này chiếm 4 byte, nhưng chỉ còn thừa 2 byte, do đó hệ thống sẽ lấp đầy 2 byte này và cung cấp thêm 4 byte mới cho int. Như vậy, số byte trong trường hợp này là (1+1+2)+4=8 byte.
Như vậy, tùy vào kiểu dữ liệu thành viên, ta cần chọn một cách sắp xếp hợp lý để có một kết quả tối ưu về bộ nhớ. Hãy quan sát lược đồ sắp xếp bộ nhớ hướng tối ưu như bên dưới (trường hợp 2).
char char int