问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

还有四个字节做什么用?

发布网友 发布时间:2023-07-24 01:28

我来回答

5个回答

热心网友 时间:2024-12-05 05:37

变量的存放默认按最大的基本成员变量类型对齐(int, double等), 比如在变量中最大的为int类型, 则一个char类型占用一个字, 但是如果后面的变量为其他类型, 则会空出3个字节再存放其他的变量; 但是这个字对齐的方式可以通过编译选项来改变, 在VC里可以用 #pragma pack(n) 来设置, n就是对齐的字节大小; 从别的地方了解到:
在 #pragma pack(n)后一定不要include其他头文件,若包含的头文件中改变了align值将产生非预期结果。
VC中提供了一种安全使用pack的方法
#pragma pack( [ push | pop ], n )
#pragma pack( push, n)
将当前的align值压入编译器的一个内部堆栈并使用 ,n作为当前的align值,而#pragma pack(pop)则将内部堆栈中的栈顶值作为当前的align值,这样就保证了嵌套pack时的正确。

补充:

结构成员内存对齐和栈内存对齐。

前者要求:字、双字和四字在自然边界上不需要在内存中对齐。(对字、双字和四字来说,自然边界分别是偶数地址、可以被4整除的地址、和可以被8整除的地址。)一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为未对齐的。

后者要求:总保持对齐,而且对齐在4字节边界上。

两者区别:前者是可以通过工具控制对齐边界的,如在vc++中就可以通过控制选项控制边界;而后者是不能控制的,必须对齐的,毕竟栈的效率太影响到程序性能了。

----------------------------------------------
入栈的过程
char c1;
//最先入栈,占用第3字节,为后续可能的变量留下位置。
short s;
//第二个入栈,要求2字节对齐,所以占用第0-1字节
char c2;
//第三个入栈,第一个四字节已经被占满,压栈。现在c1占用第7字节,s占用第4-5字节,c2占用第3字节。
int i; //要求4字节对齐。第二个四字节已经被占,所以,压栈。现在c1占用第b字节,s占用第8-9字节,c2占用第7字节。i占用第0字节。

热心网友 时间:2024-12-05 05:37

在vc6.0上调试楼主程序得到结果是
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
stack c1 0000000C, s 00000008, c2 00000004, i 00000000 与楼主结果不一样的是每一个变量都是占4个字节。
增加一个double类型变量后发现double类型变量占8个字节,其余char,short,int变量占4个字节,并不是按最大的基本成员变量类型对齐,而且如果只定义两个char变量,它们仍然分别占4个字节
是不是像“无聊人在海角”所说的栈内存要求:总保持对齐,而且对齐在4字节边界上呢?
对于楼主得到的结果,真的很奇怪,i,c2占了4个字节,而s只占了3个字节,是何原因呢?关注中...

热心网友 时间:2024-12-05 05:38

楼上说的对的
我在VC里输出的是
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
stack c1 0000000C, s 00000008, c2 00000004, i 00000000
是符合的

c和c++的参数压栈顺序是从右到左,为的是实现可变参数的函数调用。
并且参数出栈是由主调函数处理的,因为只有主调函数才知道它到底压了多少字节的参数进栈
栈区是普通的栈数据结构,遵循LIFO后进先出的规则。
关于栈的概念楼主自己找找吧
http://student.zjzk.cn/course_ware/data_structure/web/zhanhuoilie/zhanhuoilie3.1.1.htm

热心网友 时间:2024-12-05 05:38

32位机的堆栈要求按4字节对齐,这个现象应该是不同的编译器对补齐的不同处理而产生的(dev-c++ 好像用的是gcc(g++))
内存布局应该如下(其中?为补齐字节):
dev-c++: #?## #??? ####
VC: #?## ???# ####
具体两者为什么采用不同的补齐策略,我也不了解。

热心网友 时间:2024-12-05 05:39

顶楼上dove_lm
我机子运行后的结果也是这样c,8,4,0
这应该是大多数机子都是32位机(4个字节)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小篇幅造句 易车如何发布二手车 转让卖车信息流程 《易车》群聊消息关闭方法 易车消息夜间勿扰方法步骤 易车如何开启消息夜间勿扰 易车 开启@消息推送 ...当入射角是 时,反射角是 。我们能从各个方向看到本身不发光的物体... 发泄的近义词和反义词是什么_发泄是什么意思? 我的世界手游 我的世界手机版怎么做末地传送门? 我的世界手游 末地传送门怎么做? 安全评价师的报考科目有什么 为什么32位系统4字节对齐效率最高 堆分配操作为什么要求8字节对齐 ...是8字节对齐,为啥不是4字节呢?4字节是正好32位,应该可以满足需求啊... 男生遇人不淑是啥意思 遇人不淑是啥意思? 实木门四字成语 ...叫到外卖?早上五点至七点、晚上的九点至十一点可以叫外卖吗... 下半年将上市重点SUV展望 比亚迪宋L/问界M9领衔 11月29日青石桥海鲜市场营业否? 在线急求学而思2020春季班初三张馨月英语的免费百度云资源链接哪里... ...英语直播目标班三期全国版的高清视频在线观看免费资源链接,跪求分享... ...以前在u9上面下载的,,开头一个小酒馆,选择英雄,选择出来是骷髅的样... 这是什么中草药?收购价是多少? 上海南汇惠南民乐黄浦区安置房 它的位置在惠南镇什么地方? 还有什么跟飞哥大英雄差不多的电视剧 北汽吉普皮卡和长城皮卡相比,哪个好一些??? 孙膑的成语是什么 带孙膑开头的成语 九江学院专科有什么专业 中华人民共和国是几年几月几日成立到几年几月几日正好成立100年? 单亲家庭的孩子结婚后,一定要和父母一起生活么 单亲家庭怎么处理结婚后跟父母居住的问题 呼和浩特市体育场的概述 呼市海拉尔路小学好不好 呼和浩特哪里教踢足球 呼和浩特体育场在什么地址? 国家北方足球训练基地二期工程什么时候开工 呼和浩特14中足球队建队历史 人体吸入空气中含有各种气体,其中氮气那么多,人是怎么在体内分解的... 吸入的空气除了氧气还有什么?呼出的空气除了二氧化碳还有什么? 人体吸入的空气中,气体的种类很多,但主要的是氧、二氧化碳、氮三种... 化学。我们吸入的空气和呼出的气体有什么不同 输入220V输出24V容量1000VA的变压器最大输出电流是多少? 读书笔记||普通人读史记(7)秦始皇本纪之一 梦见儿手拿甘蔗是什么意思 手被甘蔗刺刺到,怎么快速去除啊 切甘蔗手指游戏 ...一盒泰山。和青秀盒子一样,但写的是尚风。为什么市面上没卖的_百 ... 要求速度又要手稳怎么形容 "快准稳"在工作中的理解是什么?