结构体内存占用问题
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) |
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字节的整数倍,执行结果为:
相关文章推荐
- [面试] 结构体占用空间的问题,内存对齐~! 真的懂了,cpu取加快速度,省空间来考虑。
- 关于常用数据内存占用的常见问题(数据类型所占内存容量、大端小端、结构体联合体)
- 结构体占用内存空间的问题
- [面试] 结构体占用空间的问题,内存对齐~! 真的懂了,cpu取加快速度,省空间来考虑。
- 有趣的问题:空结构体的内存空间占用问题
- W3wp.exe内存占用问题[转]
- 解决w3wp.exe CPU 内存占用问题
- MS SQLServer占用过多内存问题
- 解决w3wp.exe内存占用问题
- 关于SQL Server的内存占用问题.
- C/C++中结构体内存分配问题
- Linux 中结构体的内存分配问题
- Eclipse/CDT速度慢,占用内存大的问题的可用解决方案
- VC中结构体内存分配问题透析
- firefox和thunderbird的内存占用过大问题
- [转]关于结构体成员内存对齐的问题
- 结构体内存分配问题
- 解决w3wp.exe内存占用问题
- 关于MSSQL占用过多内存的问题
- Eclipse/CDT速度慢,占用内存大的问题的可用解决方案