注册 登录
编程论坛 C++教室

问个关于内存对齐的问题...

ToBeOOP 发布于 2010-12-14 18:18, 672 次点击
class Funtion  {
    private:
        char a;
        int b;
        short c;
};

那么他们的排列应该是哪个?
 1.OXXX|OOOO|OOXX
 2.OXXX|OOOO|XXOO
( X代表补充偏移空出的位置 )
我个人感觉第二种是对的...希望求解
8 回复
#2
迷失的木桶2010-12-14 19:12
为什么你认为第二个?理由。。
#3
ToBeOOP2010-12-14 19:23
我认为是..short是2字节...所以偏移量是2。.所以先偏移2。然后再偏移过的位置上补位
#4
laoyang1032010-12-14 21:27
1.    OXXX|OOOO|OOXX
我同意第一种   四个字节  首先偏移了1个字节存放char
然后4个存放int  再偏移两个存放short  
0表示占用了X 表示空缺

#5
ToBeOOP2010-12-14 21:49
首部的偏移量应该为0的吧..我看了下..偏移量是自身长度的倍数.如果short的长度为2的话..那么第一种的话则偏移了8...是2的倍数..所以我现在支持第一种= =
#6
我菜1192010-12-15 17:25
回复 5楼 ToBeOOP
如果加上#pragma pack(1)那你认为呢?
#7
ToBeOOP2010-12-15 17:51
那偏移量应该选最小值...但是首部依然不偏移
#8
pangding2010-12-15 19:34
对齐就是把它的地址对齐到访问类型的边界上。

比如 4 个字节的地址就要是 4 的倍数。这个结构的起始地址会被编译器对齐到 4 的倍数上,然后放一个 char,这个 char 不偏移。之后再放 int 的时候,要向后错 3 个字节,以对齐到 4 的倍数上。再放 short 的时候,已经是 4 的倍数了,更是 2 的倍数,也直接放。最后填充 2 个字节,是为了把结束后的地址对齐到 4 的边界上。
#9
ToBeOOP2010-12-15 21:21
明白了..谢谢各位的回答....
1