为什么是8啊,把char c注释掉结果是4,把int a 注释掉结果是1.但是为什么在一起就是8了。不明白清前辈指教!
以下为对此种现象的解释:
原来是内存对齐造成的。
英文名叫做memory alignment
大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址. 比如Motorola 68000不允许将16位的字存储到奇数地址中, 将一个16位的字写到奇数地址将引发异常.
实际上, 对于c中的字节组织, 有这样的对齐规则:
单个字节(char)能对齐到任意地址
2字节(short)以2字节边界对齐
4字节(int, long)以4字节边界对齐
不同CPU的对其规则可能不同, 请参考手册.
为什么会有上述的限制呢? 理解了内存组织, 就会清楚了
CPU通过地址总线来存取内存中的数据, 32位的CPU的地址总线宽度既为32位置, 标为A[0:31]. 在一个总线周期内, CPU从内存读/写32位. 但是CPU只能在能够被4整除的地址进行内存访问, 这是因为: 32位CPU不使用地址总线的A1和A2. (比如ARM, 它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31].)
访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了. 在4字节中, 通过A0和A1确定某一个字节.看下面的代码
#include<iostream>
using namespace std;
class Test
{
public:
char i;
char b;
char c;
int d;
} ;
int main()
{
Test a;
cout<<sizeof(a)<<endl;
}
根据内存对齐规则输出地结果是8,即使再添加一个char e;结果仍然是8.
经过测试,输出地结果一定是类中数据成员中占最大字节数的变量的整数倍。
如double a;
int b;
结果是16;
double a;
int b;
int c;
结果是16;
double a;
int b;
double c;
结果是24.
这就说明了结果一定是占最大字节数的变量所占字节的整数倍。
以上都是个人见解,如有错误请指出,谢谢。
C++测试类大小中的内存对齐问题
最新推荐文章于 2020-12-24 11:43:55 发布