<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先看一下内置数据类型的内存占用问题,如下表所示(win32):</span>
Name |
Size |
Range* |
char |
1byte |
signed: -128 to 127 |
short int (short) |
2bytes |
signed: -32768 to 32767 |
int |
4bytes |
signed: -231 to 231-1 |
long int (long) |
4bytes |
signed: -231 to 231-1 |
bool |
1byte |
true or false |
float |
4bytes |
+/- 3.4e +/- 38 (~7 digits) |
double |
8bytes |
+/- 1.7e +/- 308 (~15 digits) |
long double |
8bytes |
+/- 1.7e +/- 308 (~15 digits) |
另外,指针(不管指向什么类型),所占内存为4个字节;内存对齐问题有四条规则:
1、第一个成员变量与结构体变量的偏移量为0;
2、其他成员变量要对齐到某个数字(对齐数)整数倍的位置;
3、对齐数取编译器预设对齐数与该成员大小的较小值;
4、结构体总大小为最大对齐数的整数倍;
验证代码如下:
#include <iostream>
using namespace std;
int main()
{
char value_char;
short value_short;
int value_int;
long value_long;
bool value_bool;
float value_float;
double value_double;
long double value_long_double;
int * p_int;
char * p_char;
cout<<"char所占内存为"<<sizeof(value_char)<<"个字节;"<<endl<<endl;
cout<<"short所占内存为"<<sizeof(value_short)<<"个字节;"<<endl<<endl;
cout<<"int所占内存为"<<sizeof(value_int)<<"个字节;"<<endl<<endl;
cout<<"long所占内存为"<<sizeof(value_long)<<"个字节;"<<endl<<endl;
cout<<"bool所占内存为"<<sizeof(value_bool)<<"个字节;"<<endl<<endl;
cout<<"float所占内存为"<<sizeof(value_float)<<"个字节;"<<endl<<endl;
cout<<"double所占内存为"<<sizeof(value_double)<<"个字节;"<<endl<<endl;
cout<<"long double所占内存为"<<sizeof(value_long_double)<<"个字节;"<<endl<<endl;
cout<<"指向int的指针所占内存为"<<sizeof(p_int)<<"个字节;"<<endl<<endl;
cout<<"指向short的指针所占内存为"<<sizeof(p_char)<<"个字节;"<<endl<<endl;
return 0;
}
执行结果如下图所示:
下面讨论结构体struct内存占用问题,验证代码如下:
#include <iostream>
using namespace std;
int main()
{
struct test1
{
char value_char;
short value_short;
int value_int;
float value_float;
double value_double;
int * p_int;
};
struct test2
{
char value_char;
int value_int;
short value_short;
float value_float;
double value_double;
int * p_int;
};
cout<<"结构体test1所占内存为"<<sizeof(test1)<<"个字节"<<endl<<endl
<<"结构体test2所占内存为"<<sizeof(test2)<<"个字节"<<endl<<endl;
return 0;
}
结构体struct(或联合union)的内存占用问题涉及到字节对齐,在VS里可以进行设置,工程属性 -> 配置属性 -> C/C++ -> 代码生成 -> 结构成员对齐,如下图:
如果选择4字节对齐,成员变量内存占用不到4字节的,相邻几个变量凑够4字节的整数倍,执行结果为:
如果选择8字节对齐,成员变量内存占用不到4字节的,相邻几个变量凑够4字节的整数倍,执行结果为: