概述奇怪的行为在这个结构中消失
#include <iostream> using namespace std; #pragma pack(push,4) struct Foo { char ch; //1 char ch2; //1 char ch3; //1 char ch4; //1 _4 char ch5; //1 short num; //2 char ch6; //1 _4 int num2; //4 _4 }; #pragma pack(pop) int main() { cout << sizeof( Foo ); return 0; }
为什么输出是16字节? 我以为它一定是12,因为:
4 char = 4 bytes char + short + char = 4 bytes int = 4 bytes
那么有人可以解释剩下的4个字节在哪里?
VS2010 SP1安装。 “您尝试使用的function是在不可用的networking资源上”
为什么我的DX11游戏中加载了D3D10SDKLayers.dll?
对于windows 7上的64位安装,Python PIP有MS Visual Studio 2010 Express的path问题
windows的libffmpeg不链接(Visual Studio)?
任何已知的方法来通过USB电缆(无线networking)从iPhone浏览PC本地主机?
这与对齐有关 。
简而言之,如果不同的值在内存中“对齐”,cpu更喜欢。 例如,如果你正在处理一个标准的32位整数(4字节),大多数cpu会希望它驻留在一个可以被4除的存储器地址上。所以,内存地址10004将是OK, 10008将会没问题,但是10005不行。
大多数处理未对齐值的cpu将会抛出异常并拒绝处理。 然而,我们可靠的x86是一个例外,并会正确处理 – 虽然慢得多。 在幕后,它将从内存中获取2个对齐的整数,然后旋转这些位以从它们中提取未对齐的整数。 (在其他平台上,我认为编译器会生成额外的指令来完成这项工作,但是我不确定)所以你真的不希望发生这种情况,除非你有充足的理由。
这就是为什么你的编译器在struct成员之间生成一些填充字节的原因 – 所以short是在一个偶数地址,而int将在一个可以被4除的地址。
#pragma pack可以影响这一点,但只有当您将其设置为小于4 。 你会得到我之前提到的路线问题。
你得到的是下面的内存(| s是4字节边界):
|char char char char|char 1bytepadding short|char 3bytespadding|int|
short需要对齐到一个2字节的边界,所以在前面的char之后插入一个填充字节,以便它可以。 类似地, int必须是4字节对齐的,所以填充char 3个字节必须被插入,所以它可以是。 如果你正在优化空间的经验法则是从大到小的顺序。 如果你这样做,那将是:
|int|short char char| char char char char|
这将花费12bytes,如你所料。
这是你的偏移结构:
struct Foo { 0: char ch; //1 1: char ch2; //1 2: char ch3; //1 3: char ch4; //1 4: char ch5; //1 5: _padding //1 6: short num; //2 8: char ch6; //1 9: _padding //3 12: int num2; //4 16: };
因为你的平台上有两个字节对齐,所以在num之前加上1个字节的填充使得它的偏移量可以被2除。然后在ch6之后有3个字节使得num2除以4。
总结
以上是内存溢出为你收集整理的奇怪的行为在这个结构中消失全部内容,希望文章能够帮你解决奇怪的行为在这个结构中消失所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容