还有四个字节做什么用?
发布网友
发布时间: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个字节)