开源portal的选择

 有以下几点需要考虑:
1.非静态成员变量的大小
2.有继承关系的,其基类的大小
3.有虚函数的,一般有一个虚函数表指针(注意,只是一般,虽然现在所有的编译器都是这样实现虚函数的,但它并不是C++标准的一部分)。
4.有虚继承的,对每一个虚继承基类,一般有一个虚基类索引(指针或偏移量,“一般”的理由同第二点)。这些索引可以直接放在对象的存储空间内,如果是偏移量的话,也可以作为一项放在虚函数表中。(后面一种情况占了大多数,因为它更节省空间)
5.如果对象本身需要空间为空,即不符合1-4任何一点的,也要为它分配1字节,以避免不同对象指向同一个地址。
6.按字长对齐,这是为了硬件效率而做的,也不是必须的(但是貌似所有的编译器都做了这一点)

除了以上六点,各编译器还可以在优化策略上做各种选择,如基类子对象的位置,虚表指针的位置(开头或结尾居多),虚基类子对象的位置,虚基类索引在类或虚表中的位置,而所有这些位置又都影响了最后一点:对虚表指针共用和不能共用的情况(共用的情况:如B继承A,则A和B有可能可以共用一个虚表指针,指向B的虚表,这需要A的虚表项在B的虚表中位置一致,此时虽然指向B的虚表,但在A看来,和A的虚表无区别。这还需要虚表指针的位置策略与基类子对象的位置策略不冲突(如基类子对象固定在开头,虚表指针则固定在结尾,那么除非无成员对象,否则不能共用)。在多继承中,同一层次上最多只能和一个基类共用,因为不同基类的空间不能重叠)。所有这些策略都由编译器自行决定。结合开始六点空间需求的来源,就形成了千变万化的空间大小了。

为了不局限编译器开发者的创新能力,C++标准没有对所有这些硬性规定,所以在编码时尽量不要对对象的布局和大小做任何假设,这也是sizeof存在的原因之一。我们一般只要有一个定性的认识——如虚函数往往意味着更大的空间,再如指向基类的指针和指向派生类的指针未必存储了同一个地址(特别是多继承/虚继承的时候)等等——就足以应付绝大多数的情况了。

另:Inside the C++ Object Model真的是一本很好的书,这里所说的一切均出自它。此外还有The Design and Evolution of C++也很有用。想学好C++的人都应该读它们。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值