写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 官方公众号:【X岛揭示板】 官方微博: 【@X岛极速版】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.58430910 - 无标题 - 技术宅


回应模式
No.58430910
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

无标题 无名氏 2023-07-04(二)02:55:36 ID:Nz0YLua [举报] [订阅] [只看PO] No.58430910 [回应] 管理
问一个OOP编译相关的问题。
可能会比较蠢啊,请不要介意。

以C++为例,比如说有一个基类A,里面的内容很多。
然后分别有很多A的继类比如说B,C,D,E,F。都继承自A类。
然后这五个继类本身的差异内容比较少,可能就只是改了很少一部分参数而已。
但是都调用了基类A的不少东西。
现在有一个程序X,分别调用了BCDEF类,然后都new了之后做了很多操作。

现在比较疑惑的一点是,编译的时候是分别把BCDEF都从基类A开始编译完,然后分别都占用了一部分空间呢?
还是说基类A的部分是公用的,只编译一次A,然后每个继类的差异部分再加到A上?

换一个角度来说,就是如果我把BCDEF五个继类里面那些很小的改动,都写到基类A里面。
然后程序X通过传不同参的方式调用五次A类。

这两种写法在编译时间和编译结果的大小有区别吗?

非程序员科班出身,描述的有点抽象,不好意思(=゚ω゚)=
Tips 无名氏 2099-01-01 00:00:01 ID:Tips超级公民 [举报] No.9999999 管理
(=゚ω゚)=是不是冷场了,埋一下
无标题 无名氏 2023-07-04(二)03:09:11 ID:Nz0YLua (PO主) [举报] No.58430979 管理
写一点伪代码来补充描述。
比如说

基类A是类似于这样
class A {
int a = 0;
function_1(){...};
function_2(){...};
......
function_99(){...};
}

继类分别是
class B : public A {
a = 1;
};
class C : public A {
a = 2;
};
class D : public A {
a = 3;
};
class E : public A {
a = 4;
};
class F : public A {
a = 5;
};


像这种情况,如果我程序中
B B0 = new B();
C C0 = new C();
D D0 = new D();
E E0 = new E();
F F0 = new F();
B0.funcion_n();
C0.funcion_n();
D0.funcion_n();
E0.funcion_n();
F0.funcion_n();


另一种方法呢是:
A A1, A2, A3, A4, A5 = new A();
A1.a=1; A1.function_n();
A2.a=2; A2.function_n();
A3.a=3; A3.function_n();
A4.a=4; A4.function_n();
A5.a=5; A5.function_n();

这两种写法会有很多编译上的区别吗?
无标题 无名氏 2023-07-04(二)07:47:39 ID:YloHKCX [举报] No.58431745 管理
不同语言不同哦,以c++为例的话,因为你的函数都没有virtual 关键字,那编译的机器码里面就只有一个函数,也就是主类的那个函数,调用的时候是提供this的指针给这个函数的。

但是如果是virtual 的函数,或者是Java语言,情况会不一样
无标题 无名氏 2023-07-04(二)07:49:19 ID:YloHKCX [举报] No.58431754 管理
如果真的感兴趣的话,建议你去一些在线把代码编译成汇编的网站,自己捣鼓捣鼓,比岛上的肥哥给你解释起来,会理解深刻一些
无标题 无名氏 2023-07-04(二)20:03:11 ID:jYFoBx2 [举报] No.58441606 管理
试试 godbolt.org
无标题 无名氏 2023-07-05(三)18:28:34 ID:kAflDQa [举报] No.58457389 管理
你应该去看《深度探索C++对象模型》/《Inside the C++ Object Model》,你的所有问题都会得到解答。
ps. 可以安全的忽略掉关于多重继承的部分。

UP主: