作者liu2007 (薯)
看板C_and_CPP
标题[问题] 类别函式写在外面? & 何不全使用inline?
时间Fri Sep 4 11:12:47 2020
以下废话只是要表达自己是个初学者,如果问了笨问题还请海涵
=====================================================================
大家好 先简述一下我程式语言菜鸟的历程
我接触程式语言是大学的课程,人生第一个程式是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呢?
--
┌─────────────────────────────────┐
│
A)台南无糖红茶 E)后里龙井茶 │
│
B)金马青梅绿 F)日月潭红茶拿铁 │
│
C)台北金桔毛峰茶 G)
桃园芋泥可可 欢迎光临里洽茶铺 │
│
D)竹南纯手工爱玉冰 今晚你想来点什麽? │
└─────────────ψliu2007 ───────────────┘
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.225.144 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1599189173.A.E56.html
1F:推 steve1012: inline 只是keyword. compiler 可以自行决定是否inline 09/04 12:03
2F:→ Lipraxde: 1. 分别叫做 declaration / definition 09/04 12:08
3F:→ Lipraxde: 如果 class A、B 互相依赖的话应该就只能分开写了,有 09/04 12:08
4F:→ Lipraxde: 时後还会有编译时间、可读性等考量 09/04 12:08
5F:→ Lipraxde: 2 C++ 的 inline 不单单是指要不要 inline function, 09/04 12:12
6F:→ Lipraxde: 在写 header only library 时为了避免 multiple defini 09/04 12:12
7F:→ Lipraxde: tion,会帮写在 header 里的 function 加 inline 关键 09/04 12:12
8F:→ Lipraxde: 字 09/04 12:12
9F:→ Lipraxde: 用来告诉 linker 在 link 阶段看到多个 definition 是 09/04 12:13
10F:→ Lipraxde: 正常的,不要报错 09/04 12:13
11F:推 eye5002003: 你喜欢的话可以全写在一起塞在标头档里面,分开写的理 09/04 12:15
12F:→ eye5002003: 由主要是想缩短编译时间or不想给别人看程式码 09/04 12:17
13F:→ eye5002003: 然後C++使用者喜欢自己做决定,不想让编译器"预设" 09/04 12:18
14F:→ sarafciel: 因为inline跟noninline在odr规范上面有差 09/04 12:49
15F:→ sarafciel: inline要translation unit有看到definition才行 09/04 12:54
16F:推 CoNsTaR: 因为全部 inline binary 会肥死吧 orz 09/04 13:00
17F:→ loveme00835: 你要不要先换一本书 09/04 13:03
18F:→ loveme00835: 在讨论 inline 以前, 你知不知道 include 是在做什麽 09/04 15:59
19F:→ loveme00835: 事情? 它和 import 有什麽不一样? 当多个原始码档案 09/04 15:59
20F:→ loveme00835: 都 include 相同的标头档 (类别定义), 编译时会发生 09/04 15:59
21F:→ loveme00835: 什麽事? 因为你还没办法回答上面的问题, 所以才会有 09/04 15:59
22F:→ loveme00835: 奇怪的结论 09/04 15:59
23F:→ protoss: 其实借什麽书都不重要...重要的是你有没有真的翻过...我 09/04 19:16
24F:→ protoss: 是不太信inline这种东西需要找本好书才会有正确的观念... 09/04 19:17
25F:→ protoss: 不过当你说java的OO跟C++有冲突时我是觉得你该静下心来决 09/04 19:17
26F:→ protoss: 定好其中一本给他翻完...就是完全不太需要动脑的翻完... 09/04 19:18
27F:推 DerLuna: inline每个地方都要展开占用一份记忆体会让程式变肥 09/05 00:56
28F:→ DerLuna: 从省空间的角度预设不inline才是比较好 09/05 00:56