摘要:本文簡要介紹了VC++編譯器中結(jié)構(gòu)體大小的計(jì)算原則并給出了幾個(gè)實(shí)例
關(guān)鍵字:struct,sizeof,對(duì)齊
基本數(shù)據(jù)類型如char,int,double的大小可以直接拿到,數(shù)組的大小就是元素類型乘以數(shù)組長
度。較為復(fù)雜的類型就是結(jié)構(gòu)體,他的大小并不是簡單的把各個(gè)元素的長度相加,而是要考慮到編譯器
所做的對(duì)齊填充處理。
VC++編譯器中的結(jié)構(gòu)體的對(duì)齊要遵循以下三條原則:
一、結(jié)構(gòu)體中成員變量的偏移量(相對(duì)于結(jié)構(gòu)體起始位置)必須是該成員變量大小的整數(shù)倍。
二、結(jié)構(gòu)體的總大小必須是所有成員變量大小的整數(shù)倍。
三、當(dāng)結(jié)構(gòu)體重有嵌套的結(jié)構(gòu)體時(shí),只需把嵌套的結(jié)構(gòu)體展開。但是嵌套結(jié)構(gòu)體的第一個(gè)元素
的偏移量必須是被展開的結(jié)構(gòu)體的最大的成員變量的整數(shù)倍!
注意,以上原則只使用于微軟的C/C++編譯器(X86內(nèi)核),在其他編譯器中如GCC/G++中,
編譯器對(duì)對(duì)齊的處理時(shí)不一樣的。
下面給出了四個(gè)結(jié)構(gòu)體,這些結(jié)構(gòu)體的大小都可以通過以上三條原則計(jì)算出,實(shí)踐表明
計(jì)算結(jié)構(gòu)與在vc++編譯器中的運(yùn)行結(jié)果一致!
/*
* 計(jì)算結(jié)構(gòu)體的大小
*/
#include <iostream>
using namespace std;
struct Struct1
{
char a;
double b;
};
struct Struct2
{
char a;
double b;
char c;
};
struct Struct3
{
char a;
char c;
double b;
};
struct Struct4
{
char a;
struct StructInter
{
int b;
double c;
int d;
} Si;
int e;
};
void test()
{
cout<<sizeof(Struct1)<<endl; //16
cout<<sizeof(Struct2)<<endl; //24
cout<<sizeof(Struct3)<<endl; //16
cout<<sizeof(Struct4)<<endl;//40
}
int main(int argc, char* *argv)
{
test();
return 0;
}