【问题标题】:Why the size of a class is getting increased by 1 if I inherit more than 2 classes in C++如果我在 C++ 中继承超过 2 个类,为什么一个类的大小会增加 1
【发布时间】:2011-12-09 22:48:21
【问题描述】:

在下面的代码 sn-p 中,如果我继承前 2 个类,派生类的大小为 1,从 omwards 如果继承更多的类到派生,派生类的大小会增加这些类的数量.为什么?

// Remove the comment one by one at derived class (//Base1, //Base2//, Base3//, Base5, //Base6) and check.

struct Base {
    Base(){}
};
struct Base1 {
    Base1(){}
};
struct Base2 {
    Base2(){}
};
struct Base3 {
    Base3(){}
};
struct Base5 {
    Base5(){}
};
struct Base6 {
    Base6(){}
};
struct Derived : Base, Base1, Base2//, Base3//, Base5, //Base6
{
public:
    Derived(){}     
};

int main() {
    Derived der;
    cout << "Sizeof der: " << sizeof(der) << endl;
}

【问题讨论】:

  • 尽量让你的问题更清楚,并发布输出。
  • void main()无效的 C++
  • 类的大小取决于编译器,所以问题不应该是“在 C++ 中”,而应该是“在 Visual C++ 2008 中,编译调试时”。
  • 你真的需要那些空的构造函数吗?你的国家不使用号码4吗?
  • ¤ C++ 支持所谓的 空基类 优化,其中基类子对象不影响派生类的大小,C++11 §1.8 /5。对此的一个限制是相同类型的子对象必须具有不同的地址。但无论如何,当你不断添加不同类型的基时,如果编译器很聪明(比如 g++),它们应该被优化掉,如果它不聪明(比如 Visual c++),每个都可以加 1大小以获得唯一的子对象地址。顺便说一句,void main 不是标准的。它阻止使用 g++ 进行测试。干杯&hth.,

标签: c++


【解决方案1】:

这意味着您的编译器的空基优化不如其他编译器广泛。

您的程序的输出,所有六个基都未注释(并具有必要的包含并修复了“void main”错误)

gcc 4.6.2:Sizeof der:1

clang 3.0:Sizeof der:1

intel 11.1 大小:1

Sun C++ 5.8:Sizeof der:1

Visual Studio 2010 SP1(发布版本):Sizeof der:5

【讨论】:

  • 感谢您的回复。我在 Windows 上工作,代码是在 Visual Studio 2005 中编译的。是的!如果取消注释所有基数,则值为 5。但如果取消注释 Base,Base1 的 Sizeof der:1,但如果取消注释 Base2,输出也是“Sizeof der:2”并且 der 的大小以 1 递增更多每个基类(取消注释一个基类)。为什么即使你派生了 2 个类,der 的大小也是 1,为什么它会随着继承类的数量而增加。
【解决方案2】:

每次扩展一个类时,它都会成为最终对象的一部分,因此它的大小会增加基类对象的大小。正如已经提到的,可能有一些编译器优化会导致观察到的效果。

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 2018-11-12
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2015-12-07
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多