您的位置:首页 > 其它

结构体内存占用问题

2014-10-22 17:08 267 查看
<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

unsigned: 0 to 255

short int (short)

2bytes

signed: -32768 to 32767

unsigned: 0 to 65535

int

4bytes

signed: -231 to 231-1

unsigned: 0 to 232-1

long int (long)

4bytes

signed: -231 to 231-1

unsigned: 0 to 232-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字节的整数倍,执行结果为:


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: