摘要:本文簡要介紹了VC++編譯器中結構體大小的計算原則并給出了幾個實例
關鍵字:struct,sizeof,對齊
基本數(shù)據(jù)類型如char,int,double的大小可以直接拿到,數(shù)組的大小就是元素類型乘以數(shù)組長
度。較為復雜的類型就是結構體,他的大小并不是簡單的把各個元素的長度相加,而是要考慮到編譯器
所做的對齊填充處理。
VC++編譯器中的結構體的對齊要遵循以下三條原則:
一、結構體中成員變量的偏移量(相對于結構體起始位置)必須是該成員變量大小的整數(shù)倍。
二、結構體的總大小必須是所有成員變量大小的整數(shù)倍。
三、當結構體重有嵌套的結構體時,只需把嵌套的結構體展開。但是嵌套結構體的第一個元素
的偏移量必須是被展開的結構體的最大的成員變量的整數(shù)倍!
注意,以上原則只使用于微軟的C/C++編譯器(X86內核),在其他編譯器中如GCC/G++中,
編譯器對對齊的處理時不一樣的。
下面給出了四個結構體,這些結構體的大小都可以通過以上三條原則計算出,實踐表明
計算結構與在vc++編譯器中的運行結果一致!
/*
* 計算結構體的大小
*/
#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;
}