C++ struct内存分配大小
2013-09-01 18:18
274 查看
原文地址:http://blog.csdn.net/sosidami/article/details/5402444
C++ struct内存分配大小 一 原则: 1 所有字段在内存中出现顺序与声明顺序一致 (理论上,译器可以随便放置各个字段) 2 由于性能原因,大多数编译器实际上会将struct 的各个字段对齐放置在合适的内存边界。具体细节随着语言编译器和CPU的不同而不同。在80X86体系中,符合Intel应用二进制接口(ABI Application Bianry Interface)的编译器会将单字节对象分配在struct中任意偏移量处,字分配在字偏移量处,而双字或者更大的对象则分配在双字边界。 3 大多数编译器会确保整个记录的长度是2、4或者8个字节的整数倍,他们通过在记录的末尾添加补齐字节以增加struct长度来做到这一点。编译器之所以要补齐struct的大小,是为了要确保记录的长度是记录中的最大纯量(Scalar)对象大小或者CPU的最优对齐大小的整数倍。 4 通常编译器会提供一个选项,让你可以在全局上禁止这一功能。很多编译器还提供了pragma后者packed等关键字来让你能够逐struct地关掉字段对齐(优点是节省内存,缺点是增加了时间开销) 二 C++数据类型大小 char 1Byte short 2Byte int 4Byte long long 8Byte string 32Byte(空字符串,STL构造函数暂且将其大小置为32Byte) 三 VS2008中struct大小遵循的原则: 0 字段在内存中出现顺序与声明顺序一致(符合第1条) 1 struct的长度是最长纯量的整数倍(符合第3条) 2 struct大小符合ABI规则(符合第2条) 四 例子 string t; long long l; int i; char c; 这个大小为48=32+8+4+4 long long l; string t; int i; char c; 这个大小为48=8+32+4+4 int i; long long l; string t; char c; 这个大小为56=8+8+32+8 char c; short s; int i; long long l; string t; 这个大小为 48=2+2+4+8+32 short a; long long b; char c; short d; int e; short f; long long g; 这个真实大小为 2+8+1+2+4+2+8 实际是8+8+2+2+4+8+8=40; 五 Reference 《编程卓越之道 第一卷 深入理解计算机》Randall Hyde 张菲译 吕晓磊 2010-3-21
做点补充:
当在计算struct占用内存的大小时,可以通过以下方式:
首先按照struct中的最大的数据类型进行单个分配,如果当前数据占用不了所有的内存,同时剩下的空间可以容纳下一个数据,则第二个数据不再另外分配内存。
否则重新分配一个最大类型的内存,以此类推。
相关文章推荐
- C++ struct内存分配大小
- C/C++ struct初始化/复制/内存分配技巧
- C/C++ struct初始化/复制/内存分配技巧
- C/C++ struct初始化/复制/内存分配技巧
- union struct的内存分配方式及其sizeof大小
- C++ 中struct,class及union 内存空间分配
- 【c/c++】内存分配大小
- C/C++ struct初始化/复制/内存分配技巧
- C/C++ struct初始化/复制/内存分配技巧
- C/C++ struct初始化/复制/内存分配技巧
- C/C++ 中struct嵌套的内存分配
- C# 使用 StructLayoutAttribute 时 C# /C++ 内存空间分配与成员对齐问题
- c++中类对象分配内存大小与虚继承的一些问题
- C/C++ struct初始化/复制/内存分配技巧
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C++内存分配及字符串赋值
- 改善C++ 程序的150个建议学习之建议27:区分内存分配的方式
- 浅析C++内存分配与释放操作过程——三种方式可以分配内存new operator, operator new,placement new
- C++与Java数组内存的分配
- 全面介绍Windows内存管理机制及C++内存分配实例