我有两个场景,一个是继承,另一个没有。
首先:
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。
在上述场景中有什么建议,我们知道只有两个类具有相同的数据成员?
答案 0 :(得分:-1)
您不必担心这些细节,并完全专注于最能代表您的应用领域的设计。
你应该问的真正问题是,B是否真的是A,即每次你使用A,你也可以使用B.
尽管如此,为了好奇:
我通过添加main()
创建A和B对象并调用它们的唯一函数来编译MSVC2013的两个版本(我在第二个示例中使用了相同的prnt主体进行比较可比的东西)。在调试和发布模式下,exe文件最终完全相同。
正如评论中所指出的,编译器做得非常好。例如,在发布模式下,它内联函数invokation的代码,从而产生相同的main()机器代码。对于第二个版本,为B::prnt()
生成了额外的代码,但显然链接器识别出未使用的函数并将其丢弃。
当然,对于更复杂的代码,结果可能会有所不同。内联并不总是可行的,并且函数可能有很小的差异,这使得重复数据删除更加困难。
作为tumb的规则,代码的大小将更多地取决于您编写的代码(和复制/粘贴代码)的数量,而不是继承。事实上,继承应该自然地生成更小的代码(尤其是对于较旧的优化较少的编译器),因为继承关系告诉编译器它可以/应该重用公共代码。