关于C/C++中结构体(Struct)类型的sizeof结果的探讨

关于C/C++中结构体(Struct)类型的sizeof结果的探讨



看了很多关于sizeof()的使用解释和说明,对于内置类型来说,基本没有什么问题,但是一旦将sizeof()用于结构体类型或其变量,就有点犯晕。很多地方没有给出一个可以套用的模式来说明其所得的结果是什么,有的说到了字节对其问题,例如,CPU的优化规则:对于n个字节的元素,它的首地址能被n整除,才能过的最好的性能。但是仅仅利用这一规则来推算sizeof的结果有时是不正确的。这也说明编译器并不是简单的按照这一规则进行地址分配。有的地方说了什么按字节对齐,大部分说的是按4字节对齐的方式进行推算,按字节对齐的目的很清楚,就是为了避免去一个数访问两次地址,例如,机器字为四个字节,系统为了提高速度,总是按四的倍数的方式存取内存,如果一个变量分配的地址是5(0为首地址)那么,需要首先取出地址编号为4-7的字节的内容,而后将第四个字节的内容舍弃,只保留第五到第七字节的,而后再去取8-11位置的字节,将编号8的字节拼接到上次取出的后三个字节后面,9-11舍弃不用,很明显,这样会严重的降低系统的性能。因此,编译器总是按字节对齐的方式分配地址,对于struct类型的分配,不能简单的按上面说的两种情况去推算,因为编译器并不是简单的那样做。下面探讨一下struct型的地址分配规律。

struct A

{
char a1;
char a2;
char a3;
};

结果为3;按一个字节对齐

struct  A1

{

 char  a1;

 char a2;

 short a3;

};

结果为 4;按两个字节对齐
struct B
{
short a1;
short a2;
short a3;
};

结果为 6 。按两个字节对齐

struct B1
{
short a1;
short a2;

        short a3

int a4;
};
结果为 12;按四个字节对齐

struct C
{
int a1;
int a2;

        int a3;

};

结果为12; 按四个字节对齐

struct C1
{

   

        int a1;

double d;

float f;  

     short s;

char c;
    
};

结果为 24 。按八个字节对齐


通过上面的测试我们可以看到,编译器在处理struct型的地址分配是有规律可循的,但并不是简答的按照上面的两种情况去做。而是更加的复杂一下:

1.首先确定本sizeof()中struct按几个字节对齐。很明显,是按结构体中的成员中的最大的那个类型字节数对齐。

2. 其次,保证分配是按1中确定的字节数对齐。也即是说,一是保证相对地址能够被其自身大小n整除 ,二是不能够取一个数访问两次地址。

下面在看一种情况

struct C2
{

   

        int a1;

double d;

float f;  

     short s;

char c;
    
};

struct  A2

{

 char  a1;

  C2  c;  

};

结果为 32;

其实对于成员是结构体类型的情况,只要将其展开即可。将其成员按顺序放入父结构体中即可。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值