二进制可执行文件的大小是否依赖于继承?

时间:2015-07-16 14:29:24

标签: c++ inheritance compiler-optimization

我有两个场景,一个是继承,另一个没有。

首先:

Class A
{
    public:
    int a;
    void prnt() { cout << "class A"; }
}    
Class B: public A
{
}

第二

Class A
{
    public:
    int a;
    void prnt() { cout << "class B"; }
}

Class B
{
    public:
    int a;
    void prnt() { cout << "class A"; }    
}
  • 继承是否增加了可执行文件的大小? 如上例所示,在第一个场景中,我从A派生了B类,因此B具有B的所有数据成员。在第二个场景中,我只是将代码从A类复制粘贴到B。

  • 在上述场景中有什么建议,我们知道只有两个类具有相同的数据成员?

  • 我们应该使用继承,还是只创建两个单独的类?
  • 两种情况下最终可执行文件的大小会有什么不同吗?

1 个答案:

答案 0 :(得分:-1)

您不必担心这些细节,并完全专注于最能代表您的应用领域的设计。

你应该问的真正问题是,B是否真的是A,即每次你使用A,你也可以使用B.

尽管如此,为了好奇:

  • 我通过添加main()创建A和B对象并调用它们的唯一函数来编译MSVC2013的两个版本(我在第二个示例中使用了相同的prnt主体进行比较可比的东西)。在调试和发布模式下,exe文件最终完全相同。

  • 正如评论中所指出的,编译器做得非常好。例如,在发布模式下,它内联函数invokation的代码,从而产生相同的main()机器代码。对于第二个版本,为B::prnt()生成了额外的代码,但显然链接器识别出未使用的函数并将其丢弃。

  • 当然,对于更复杂的代码,结果可能会有所不同。内联并不总是可行的,并且函数可能有很小的差异,这使得重复数据删除更加困难。

  • 作为tumb的规则,代码的大小将更多地取决于您编写的代码(和复制/粘贴代码)的数量,而不是继承。事实上,继承应该自然地生成更小的代码(尤其是对于较旧的优化较少的编译器),因为继承关系告诉编译器它可以/应该重用公共代码。