C ++多态内存成本

时间:2013-04-01 11:12:01

标签: c++ polymorphism virtual-functions

我有这段代码:

    #include <stdio.h>

    class CoolClass {
    public:
      virtual void set(int x){x_ = x;};
      virtual int get(){return x_;};
    private:
      int x_;
    };

    class PlainOldClass {
    public:
      void set(int x) {x_ = x;};
      int get(){return x_;}
    private:
      int x_;
    };
    int main(void) {
      printf("CoolClass size: %ld\n", sizeof(CoolClass));
      printf("PlainOldClass size: %ld\n", sizeof(PlainOldClass));
      return 0;
    }

我有点困惑,因为它说CoolClass的大小是16?怎么样?为什么?即使使用指向vtable的指针,也不应该是8的大小?老班的大小是预期的4。

编辑:我用g ++ 4.6.3运行Linux Mint 64位。

4 个答案:

答案 0 :(得分:5)

除了charunsigned char之外,您不能假设任何其他内容的大小。如果你在64位平台上构建,int可能仍然是4个字节,但虚拟表指针的大小可能是8,额外的4个字节用于填充(所以指针对齐到8个字节。)

64位

+----+----+----+----+
| vp | vp | x_ | p  |
+----+----+----+----+

vp - virtual table pointer
x_ - member
p  - padding byte

32位

+----+----+
| vp | x_ |
+----+----+

vp - virtual table pointer
x_ - member
p  - padding byte

Padding not required because the pointer is already aligned

作为测试,您可以尝试

class PlainOldClass {
private:
  int* x_;
};

,其大小为8。

答案 1 :(得分:4)

我最好的猜测是你正在编译一个64位指针的平台。那么你需要8个字节用于虚拟指针,可能需要4个字节用于int(一些64位平台也会提供8个字节 - 但你说sizeof (PlainOldClass)是4,所以这样做“这里适用”,另外4个给类提供指针所需的64位对齐 - 总共16个字节。

答案 2 :(得分:2)

我认为费用是:

  
      
  • 平台有64位指针,所以8个字节用于虚拟指针
  •   
  • int的4个字节(但在某些平台上也可能是8个字节)
  •   
  • 4为类提供指针所需的64位对齐
  •   

sum = 16个字节。

答案 3 :(得分:1)

这是因为你的系统可能是64位系统,因此它会成为,

  • 8个字节,用于vptr。
  • 4个字节用于int
  • 和额外的4个字节填充,以便为指针提供64位对齐。

因此总和变为16。