C++ struct内存分配大小

原文地址: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中的最大的数据类型进行单个分配,如果当前数据占用不了所有的内存,同时剩下的空间可以容纳下一个数据,则第二个数据不再另外分配内存。
否则重新分配一个最大类型的内存,以此类推。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值