摘要:本文简要介绍了VC++编译器中结构体大小的计算原则并给出了几个实例
关键字:struct,sizeof,对齐
基本数据类型如char,int,double的大小可以直接拿到,数组的大小就是元素类型乘以数组长
度。较为复杂的类型就是结构体,他的大小并不是简单的把各个元素的长度相加,而是要考虑到编译器
所做的对齐填充处理。
VC++编译器中的结构体的对齐要遵循以下三条原则:
一、结构体中成员变量的偏移量(相对于结构体起始位置)必须是该成员变量大小的整数倍。
二、结构体的总大小必须是所有成员变量大小的整数倍。
三、当结构体重有嵌套的结构体时,只需把嵌套的结构体展开。但是嵌套结构体的第一个元素
的偏移量必须是被展开的结构体的最大的成员变量的整数倍!
注意,以上原则只使用于微软的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;
}