[问题] 类别函式写在外面? & 何不全使用inline?

楼主: liu2007 (è–¯)   2020-09-04 11:12:47
以下废话只是要表达自己是个初学者,如果问了笨问题还请海涵
=====================================================================
大家好 先简述一下我程式语言菜鸟的历程
我接触程式语言是大学的课程,人生第一个程式是c
但是教授为了授课内容很快就跳c++(至少上课范例程式都直接存成cpp)
但可能是因为学店的关系吧,其实也没讲多少深入的东西
后来大三进入java的世界,然后深入学习java下的OO概念。
我其实不知道自己学到怎样的程度,只能说比较基本的没问题,
reflect以后的比较没在碰。
一个月前借了《c++全方位学习》回来摸索c++,最近才读到类别的章节
发现有些东西跟java的OO概念有点冲突,好不适应XDD 必须要放空去学习
=====================================================================
1.为何要赋予可实作成员函式于定义类别之外(想请问这个动作有术语吗)?
class CRectangle {
int x, y;
public:
void set_values (int,int);
int area (void) {
return (x*y);
}
}
void CRectangle::set_values (int a, int b) {
x = a;
y = b;
}
为什么成员函数不在定义类别的时候就决定好,而要在定义类别之外才补完?
是为了提供类似java OO的抽象函数的概念吗?
(例如定义一个类别叫做动物,动物会"移动",
但实际上怎么移动是由子类别去实作,所以
动物类别在移动这个成员函式就先不实作。
请问cpp有这个弹性的原因如上述吗?)
2.inline 好像很棒,默认为何不直接inline?
根据网络资料里头提到(大学课程的教材:C++物件导向及增进效率程式技巧)
在 class 内部直接定义完整的函数,和只定义函数的原型而把具体实现放在 class
外部的唯一区别在于,在第一种情况中,编译器(compiler) 会自动将函数作为
inline 考虑,而在第二种情况下,函数只是一般的 class 成员函数。
然后我又去查inline是什么东东,以我的了解是:
编译器会对加上inline的函式进行评估,
当展开函式内容比呼叫函式所花的成本还小时就会直接展开函式
而编译器也会评估,如果展开后的效益不够,即便函式加上inline
编译器也不会进行展开。
如果以上我的了解是正确的
那为何cpp不默认所有函式都是inline的作法?
反正展开的效益有编译器为我们把关来决定展开与否不是吗?
为什么会像现在这样要由使用者自己决定是否要加inline呢?
作者: steve1012 (steve)   2020-09-04 12:03:00
inline 只是keyword. compiler 可以自行决定是否inline
作者: Lipraxde (Lipraxde)   2020-09-04 12:08:00
1. 分别叫做 declaration / definition如果 class A、B 互相依赖的话应该就只能分开写了,有时后还会有编译时间、可读性等考量2 C++ 的 inline 不单单是指要不要 inline function,在写 header only library 时为了避免 multiple definition,会帮写在 header 里的 function 加 inline 关键字用来告诉 linker 在 link 阶段看到多个 definition 是正常的,不要报错
作者: eye5002003 (下一夜)   2020-09-04 12:15:00
你喜欢的话可以全写在一起塞在标头档里面,分开写的理由主要是想缩短编译时间or不想给别人看程式码然后C++使用者喜欢自己做决定,不想让编译器"默认"
作者: sarafciel (Cattuz)   2020-09-04 12:49:00
因为inline跟noninline在odr规范上面有差inline要translation unit有看到definition才行
作者: CoNsTaR ((const *))   2020-09-04 13:00:00
因为全部 inline binary 会肥死吧 orz
作者: loveme00835 (发箍)   2020-09-04 13:03:00
你要不要先换一本书在讨论 inline 以前, 你知不知道 include 是在做什么事情? 它和 import 有什么不一样? 当多个原始码档案都 include 相同的标头档 (类别定义), 编译时会发生什么事? 因为你还没办法回答上面的问题, 所以才会有奇怪的结论
作者: protoss (天生散人)   2020-09-04 19:16:00
其实借什么书都不重要...重要的是你有没有真的翻过...我是不太信inline这种东西需要找本好书才会有正确的观念...不过当你说java的OO跟C++有冲突时我是觉得你该静下心来决定好其中一本给他翻完...就是完全不太需要动脑的翻完...
作者: DerLuna (阳月)   2020-09-05 00:56:00
inline每个地方都要展开占用一份内存会让程式变肥从省空间的角度默认不inline才是比较好
作者: LiloHuang (十年一刻)   2020-09-06 10:56:00
inline 不一定会变快 https://tinyurl.com/j34kmle

Links booklink

Contact Us: admin [ a t ] ucptt.com