结构体内存对齐问题

今天参加的C/C++笔试,总的来说,感觉已经比以前好多了,相信是每天及时总结的缘故,废话不多说,下面继续坚持。

今天大致做了三块内容,首先计算机网络通信,然后是数据结构部分,最后才是C/C++的题目。

前两者另外再做小结,先就C/C++。

(1)内存对齐问题:

对这个问题,以前我也总结过,一段时间没有回看尽然有点忘了。想了想,今天没有结合具体的编译器说明,回答的不够严谨是我最大的败笔。

问题的引出:

struct F

{

char a;

int b;

}

使用sizeof(F)的答案是8个字节而不是简单的相加。

“内存对齐”的概念:许多实际的计算机系统对基本类型的数据在内存中存放位置有限制,常要求这些数据的首地址是某个数值的倍数,这就是所谓的内存对齐。

从性能上来说,在对齐的地址上访问数据的速度快。位于32位的系统每次总线周期只能读到4个字节。

上面的一个数据成员a与结构体的偏移量为0,总是存放在偏移量为0的地址上,其他成员对齐到某个数字(对齐数)的整数倍,该数字是默认对齐数和该成员的字节数的较小值。结构体的总大小是最大对齐数的整数倍。

GNU g++对齐数只能取1,2,4,默认是4,其余跟win平台一样。

  1 #include <stdio.h>
  2 struct a
  3 {
  4     char b;
  5     char c;
  6     short ccd;
  7     unsigned char d;
  8 };
  9 
 10 struct e
 11 {
 12     char f;
 13     char g;
 14     short h;
 15     char *i;
 16 };  
 17 
 18 int main()
 19 {
 20     printf("%d\n",sizeof(struct a));
 21     printf("%d\n",sizeof(struct e));
 22     return 0;
 23 }  

打印结果为,6,8.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值