# include<iostream> using namespace std; class A{ public : int b; void test() { int j; } private: char c; int a; }; int main() { cout<<sizeof(A)<<endl; }
为什么是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确定某一个字节.
英文名叫做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.
这就说明了结果一定是占最大字节数的变量所占字节的整数倍。
以上都是个人见解,如有错误请指出,谢谢。
#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.
这就说明了结果一定是占最大字节数的变量所占字节的整数倍。
以上都是个人见解,如有错误请指出,谢谢。
本文深入解析了内存对齐原理及其实现机制,并通过具体代码示例展示了不同数据类型在内存中的排列方式及其对整体大小的影响。
1万+

被折叠的 条评论
为什么被折叠?



