32位系统: 64位系统
类型 大小 大小
char 1 1
char * 4 8
int 4 4
int * 4 8
short 2 2
short int 2 2
long 4 4
long int 4 4
long long 8 8
unsigned long long 8 8
double 8 8
long double 8 8
float 4 4
bool 1 1
自己写个代码运行一下就一目了然了
cout << "char " << sizeof(char) << endl;
cout << "char * " << sizeof(char*) << endl;
cout << endl;
cout << "int " << sizeof(int) << endl;
cout << "int * " << sizeof(int*) << endl;
cout << "short " << sizeof(short) << endl;
cout << "short * " << sizeof(short*) << endl;
cout << "short int " << sizeof(short int) << endl;
cout << "long " << sizeof(long) << endl;
cout << "long * " << sizeof(long*) << endl;
cout << "long int " << sizeof(long int) << endl;
cout << "long long " << sizeof(long long) << endl;
cout << "unsigned long long " << sizeof(unsigned long long) << endl;
cout << endl;
cout << "double " << sizeof(double) << endl;
cout << "double * " << sizeof(double*) << endl;
cout << "long double " << sizeof(long double) << endl;
cout << endl;
cout << "float " << sizeof(float) << endl;
cout << "float * " << sizeof(float*) << endl;
cout << endl;
cout << "bool " <<sizeof(bool)<< endl;
指针类型变量32位系统占4个字节 64位系统占8个字节
举个栗子:
32位系统
int* a sizeof(a)=4
int a[4] sizeof(a)=16//一个int占用4个位
64位系统
int* a sizeof(a)=8
int a[4] sizeof(a)=16//一个int占用4个位
关于结构体字节对齐问题
struct Struct1
{
char a[10];
char b[3];
};
cout <<"Struct1 "<< sizeof(Struct1) << endl;
输出的结果为 Struct1 13
struct Struct2
{
char a[10];
double b[3];
};
cout << "Struct2 " << sizeof(Struct2) << endl;
输出的结果为 Struct2 40
关于结构体字节对齐原则
寻找结构体成员变量中占用内存空间最大的那个元素,以其地址的整数倍为单位。比如结构体有变量类型char int double,则计算时应该以double占用的字节数(8位)的整数倍为准,不够8的整数倍时会自动补齐。比如上面的结构体Struct2,char a[10]大小为10,double b[3]大小为24,手指头算了一下以为会是34,但是执行结果为40,其原理就是34以8对齐的最小上界整数是40,故执行结果为40。
关于#pragma pack
通过#pragma pack可以自己设定对齐方式,但是编译时会在#pragma pack设定的值和默认的值中选择最小的值作为对齐的单位
再举个栗子:
#pragma pack(2)
struct Struct1
{
char a[13];
};
cout <<"Struct1 "<< sizeof(Struct1) << endl;
输出结果为 Struct1 13
尽管我们自己设定的大小是2个字节,但是char默认是1个字节,所以取小的值为对齐的单位。
那大家猜猜下面的代码输出的结果会是什么?
#pragma pack(2)
struct Struct1
{
char a[13];
int b;
};
cout <<"Struct1 "<< sizeof(Struct1) << endl;
如果你说出的答案是18,则恭喜你已经很好的理解了对齐方式了。
因为我们定义以2字节对齐,结构体默认的是以4字节对齐,选最小的整数2对齐,则结果当然是18而不是20啦。
看到一篇写的很好的文章分享给大家:5分钟搞定内存字节对齐