我有这段代码:

    #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位。

最佳答案

除了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。

关于C++多态内存成本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15742337/

10-09 13:08