C/C++ 结构体所占字节数计算 复习记录

本文探讨了C/C++中结构体内存对齐的概念,解释了为何结构体大小并非简单成员大小之和。通过实例分析,解释了编译器如何根据对齐规则调整结构体成员的位置和填充字节,以及#pragma pack(n)对结构体大小的影响。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述

这是因为结构体内存对齐的原因, 两个int 是8个字节, 一个char是 1 个字节, 这个结构体按道理说是 9 个字节, 但实际上是 12 , 这就涉及到了内存对齐的原因, 我的编译器是 MinGw-64 , 默认对齐是4个字节, 也就是说不到四个字节的会自动补齐到四个字节

详情见附文











原本觉的c语言学的还不错,今天看了一下c语言的有关书籍,看到求结构体大小的例子,心想这不是很简单吗,不就是把所有成员的大小加起来就行了,其实远没我想的简单,看来c语言还要继续学习哈哈。
先看一个实例

typedef struct 
{
   
        char c;
	int b;
	short d;
}A;

 
 
 

这个结构体的大小是多少了,我做的是char占1字节,int占4字节,short占2字节,1 + 4 + 2 = 7. 总共占7字节。哈哈完全错误。
正确结果

12

为什么是12呢?不急我们在看一个实例

typedef struct 
{
   
        char c;
	short d;
	int b;
}B;

 
 
 

这个大小又是多少呢,相信细心的你一定会问,这和上个结构体不是一样的吗,只是在定义的时候把 int b; 和 short d; 对调了一下。应该结果和上个一样吧。当初我也是这样想的,结果哈哈又错了。
正确答案

8

这是为什么呢,相信你们已经迫不及待想知道答案了吧。那我们就来一一揭晓啦。
这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。
 在C99标准中,对于内存对齐的细节没有作过多的描述,具体的实现交由编译器去处理,所以在不同的编译环境下,内存对齐可能略有不同,但是对齐的最基本原则是一致的,对于结构体的字节对齐主要有下面两点:

  1. 结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整 数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值