社区
C++ 语言
帖子详情
结构体长度问题?
aa122333
2009-02-28 07:46:29
struct st1
{
char p1;
char p3;
short p2;
int p4;
};
struct st2
{
char p1;
short p2;
char p3;
int p4;
};
哪位知道,为什么sizeof(st1)==12;sizeof(st2)==8???
...全文
225
13
打赏
收藏
结构体长度问题?
struct st1 { char p1; char p3; short p2; int p4; }; struct st2 { char p1; short p2; char p3; int p4; }; 哪位知道,为什么sizeof(st1)==12;sizeof(st2)==8???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lovewwy
2009-02-28
打赏
举报
回复
先分配一单位长度(结构体中占内存最多数据类型,如int的长度4),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。
struct st1 1+1+2+4=8
struct st2 1+1空+2+1+3空+4=12
jakqigle
2009-02-28
打赏
举报
回复
资料:
分析例子B;
struct B
{
char b;
int a;
short c;
};
假 设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指定 对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4, 所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为 2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的 都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12;其实如果就这一个就来说它已将满足字节对齐了, 因为它的起始地址是0,因此肯定是对齐的,之所以在后面补充2个字节,是因为编译器为了实现结构数组的存取效率,试想如果我们定义了一个结构B的数组,那 么第一个结构起始地址是0没有问题,但是第二个结构呢?按照数组的定义,数组中所有元素都是紧挨着的,如果我们不把结构的大小补充为4的整数倍,那么下一 个结构的起始地址将是0x0000A,这显然不能满足结构的地址对齐了,因此我们要把结构补充成有效对齐大小的整数倍.其实诸如:对于char型数据,其 自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,这些已有类型的自身对齐值也是基于数组考虑的,只 是因为这些类型的长度已知了,所以他们的自身对齐值也就已知了.
aa122333
2009-02-28
打赏
举报
回复
哦,谢谢
night_blue
2009-02-28
打赏
举报
回复
这个应该与编译器的内存对齐规则用关系,换个编译器换个系统得到的结果很可能就不一样了。
你可以使用伪指令 #pragma pack()按照自己的需要对齐内存
aa122333
2009-02-28
打赏
举报
回复
short p2; [3][4]
int p4; [5][6][7][8]
那请问这里的起始位置3为什么不是4,不是2的整数倍吗
还有5为什么不是8,4的整数倍啊???
猫已经找不回了
2009-02-28
打赏
举报
回复
[Quote=引用 5 楼 aa122333 的回复:]
不懂,那为什么
int p4; [5][6][7][8]
5不是4的整数倍
[/Quote]
汗,我打错了。。
struct st1
{
char p1; [0]
char p3; [1]
short p2; [2][3]
int p4; [4][5][6][7]
};
楼主很细心的说,我刚才打字快了点。
szqh97
2009-02-28
打赏
举报
回复
1楼的很清楚了啊
petera
2009-02-28
打赏
举报
回复
结构体和类都有字节对齐,数剧写的顺序不同,占的内存可能不同,所以写结构体和类时最好同类形的写在一齐如第一种那样
aa122333
2009-02-28
打赏
举报
回复
不懂,那为什么
int p4; [5][6][7][8]
5不是4的整数倍
oyljerry
2009-02-28
打赏
举报
回复
内存对齐除了要考虑各种类型变量所占空间,还要考虑编译器默认的4字节对齐格式,在这个条件下,为了节省空间,编译器会尽可能把能在4字节放得下的前后变量放在一起。理解了这个就知道为什么两个结构体大小为什么不一样了
Andydanlin
2009-02-28
打赏
举报
回复
自己对齐!
aa122333
2009-02-28
打赏
举报
回复
上边的不好意思打错了
应该是为什么sizeof(st1)==8;sizeof(st2)==12???
猫已经找不回了
2009-02-28
打赏
举报
回复
你发错了。sizeof(st1)==8;sizeof(st2)==12
自己查查字节对齐的规则
struct st1
{
char p1; [0]
char p3; [1]
short p2; [3][4]
int p4; [5][6][7][8]
};
struct st2
{
char p1; [0]
short p2; [2][3] //占2字节,起始地址要是2个整数倍
char p3; [4]
int p4; [8][9][10][11] //4字节,起始地址是4的整数倍
};
结构体
定义使用及指针
长度
问题
1.
结构体
定义
结构体
长度
问题
为了加快数据存取的速度,编译器默认情况下会对
结构体
成员和
结构体
本身(实际上其他数据对象也是如此)存储位置进行处理,使其存放的起始地址是一定字节数的倍数,而不是顺序存放,称为字节对齐。字节对齐的规则为: (1)
结构体
变量的首地址能够被其最宽基本类型成员的大小所整除; (2)
结构体
每个成员相对于
结构体
首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; (3)
结构体
的总大小为
结构体
最宽基本类型成员
VS中C++
结构体
数组
长度
为变量
问题
在使用
结构体
数组时,数组
长度
的定义不能使用变量。本人的环境是VS2019
c++中关于
结构体
长度
的计算
问题
说明:
结构体
的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐
问题
。这些
问题
在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结
结构体
的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不
C语言中
结构体
数据字节
长度
问题
问题
: 在复习c语言中
结构体
时,遇到如下
问题
。 定义
结构体
: typedef struct student{ char sex; int age; char status; }STUDENT; int main() { printf("%d",sizeof(STUDENT)); return 0; } 试着去计算结构所占内存空间的大小: 思考 在32位操作系统中,int 所占4个字节,char占...
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章