首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多态内存成本

C++多态内存成本
EN

Stack Overflow用户
提问于 2013-04-01 19:12:01
回答 4查看 326关注 0票数 5

我有这段代码:

代码语言:javascript
复制
    #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吗?oldclass的大小如预期的那样为4。

编辑:我运行的是带有g++ 4.6.3的Linux Mint 64位。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-01 19:14:38

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

64位

代码语言:javascript
复制
+----+----+----+----+
| vp | vp | x_ | p  |
+----+----+----+----+

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

32位

代码语言:javascript
复制
+----+----+
| vp | x_ |
+----+----+

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

Padding not required because the pointer is already aligned

作为测试,您可以尝试

代码语言:javascript
复制
class PlainOldClass {
private:
  int* x_;
};

它的大小是8。

票数 5
EN

Stack Overflow用户

发布于 2013-04-01 19:16:19

我最好的猜测是,您正在为具有64位指针的平台进行编译。然后,虚拟指针需要8个字节,int可能需要4个字节(一些64位平台也会提供8个字节-但是您说sizeof (PlainOldClass)是4,所以这里不适用),另外需要4个字节来给类提供指针所需的64位对齐-总共16个字节。

票数 4
EN

Stack Overflow用户

发布于 2013-04-01 19:18:37

我认为代价是:

  • platform具有64位指针,因此8字节用于虚拟指针
  • 4字节用于int (但在某些平台上也可能为8字节)
  • 4为该类提供pointer

所需的64位对齐方式

sum=16字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15742337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档