C++类的存储空间和空间大小的问题

【lightnut】:
找本书看: Inside C++ Object Model (深入探索C++对象模型).

【liehen8475】:
普通成员函数不分配空间,可以把他当作是库函数使用,因为它是静态绑定的。
但是当类中定义了虚函数,要有4个字节(多个虚函数也是4个字节)的指针指向虚函数表。
剩下的成员定义顺序分配并按#pragma pack(n)中的n对齐(windows默认为2)

http://community.csdn.net/Expert/topic/5573/5573227.xml?temp=.9110987
希望对你有些帮助

【liehen8475】:
是这个
http://community.csdn.net/Expert/topic/5573/5573227.xml?temp=.499798

【Vitin】:
也可以看一下

http://community.csdn.net/Expert/TopicView.asp?id=5558320

【dcbenwu】:
[引用]
现在在细致的讨论下类的存储,在class中成员变量按照顺序按照对齐要求在内存中排列,而普通成员函数在编译时是静态绑定,类调用时就象调用库函数一样,所以类空间中没有为普通成员函数分配空间,但是虚函数和纯虚函数是动态绑定的,编译时需要一个指针指向一个虚函数表,所以当类中有虚函数时,类的内存分配为  成员变量+虚函数表指针(4个字节,多个虚函数也只有一个该指针)。

【dcbenwu】:
[引用]
只要有几点需要考虑:
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真的是一本很好的书,这里所说的一切均出自它。此外还有Design and Evolution of C++也很有用。想学好C++的人都应该读它们。

【dai_weitao】:
有几个要点,你记住就行了.
1` 非虚函数不占类空间.
2` 虚函数占4字节空间, 因为Virtual-Table的原因.
3` 成员占空间
4` 对齐原则

【millky】:
首先解决第一个问题,就是说空类的内存占用量为1,这是因为C++要保证被一个类的对象都有一个特定的地址,因而赋予给他一个地址作为标识;当有了成员变量了就不需要了,因此不是1了,而是由字节对齐所决定。int默认占用4个字节的。当然,你举的例子并不存在任何关于静态绑定或者动态绑定的问题。struct的也是一样的。如果还是不明白,可以到我的blog去看看。
ps:谢谢裂痕同志,帮我解决了这个疑问!!

【monk0128】:
Inside the C++ Object Model
这本书里面介绍得很详细了,我刚在看呢,在Chapter3&4
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值