大量创建的对象需要谨慎构建其数据成员

我们在一些一个class或者struct时,数据成员的顺序对程序的编译和执行没有什么影响,但对class或struct占用的空间却可能产生影响。因此适当的排列数据成员的顺序,以及精心的计划class或struct中数据成员的大小,对于那些需要创建几万、几十万、几千万的对象来说,空间上的差别就很有价值了。

下面先看看一个利用struct将一个4字节的整数分成两部分用的例子:

struct PackStruct {
  unsigned int char_:8;
  unsigned int frequence_:24;
}

这个结构占据了4个字节,它用unsigned int的前8位用于存储1个字符,而后24位用于存储该字符的频率,频率可以存储2的24次方个,也就是说可以统计16777216个字符的文本,也就是16M的文本,如果超出了16M,那么可能会产生频率的溢出(当16M都是同一个字符时)。

如果将结构定义为下面的形式:

struct UnpackStruct {
  char char_;
  unsigned int frequence_;
}

UnpackStruct看似仅仅增加了1个字节,但实际UnpackStruct占用了8个字节,这主要是因为C++缺省使用4字节对齐的缘故,这样的对齐有利与提高存取速度,是一种以空间换时间的策略。

参考文献[1]对C++数据的对齐进行了非常全面的分析,是一篇非常有价值的文章。

参考文献:

[1]http://pppboy.blog.163.com/blog/static/30203796201082494026399/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值