作者yoco315 (眠月)
看板C_and_CPP
标题常见的 C++ 错误观点
时间Sun Mar 8 17:11:44 2009
我也跳下来玩,不过我 C++ 很弱,请打小力一点 <(_ _)>
1. 效能比 C 差
这个最常见的理由就是「C++
一定会塞很多你
不知道的东西在里面」
我只能说「
不知道的东西也敢讲得这麽
肯定,不简单。你不知道,我可是都很知道。」
有的人会拿出这个说法,大概是看了台湾坊间十年前的烂书,
事实上在十年前的 Inside C++ Object Model(我看这本的时候还没中文版)就讲了,
「你不需要付出你不需要付出的代价」当一个东西你没有用到,C++ 就不会 charge 你。
当 C++ 你只用跟 C 同等语法功能的时候,run time overhead 最多 5%。
当你需要 OO,exception,template 等功能的时候,
你用 C 语言实作这些功能,最多也只能跟 C++ 一样快,
一般状况是更慢,而且你要实作到一样快,你的 C 得受过相当训练。
(更别说大部分的人连 C 要怎麽实作 OO 跟 exception 都不知道了)
现在那 5% 也几乎不见了,
事实上,现在 C++ 普遍可以作到比 C 更好的效能,
std::sort() 狂电 qsort() 三倍是十年前就知道的东西,
一般容器的效能 C++ 也比 C 好 40%。
C 用 function pointer 的地方很多都可以用 C++ functor 来作到数倍的效能提昇。
这是 C 永远作不到的最佳化。
「效能差」是 C 拥护者在十多年前的说词了,
老实说多看看 news group,会发现现在已经没人讲这个了,
拜托不要再拿出来讲了,这点真的是解释太多次多到我都想睡了 orz
(附带提一下,现在要打 C++ 顶多就是讲太 expert friendly)
2. C++程式不易读
这是十年前 Java 用来打 C++ 的论点,
Java 当初真的喊很大声,让我们复习一下 Java 当初讲了什麽:
我们不支援 operator overloading,因为你不能保证使用者不会乱用,
谁知道他帮 Integer 实作的 operator + 里面是不是减法呢?
是不是很好笑?讲得好像 Java 的 compiler 会检查出下面这种东西然後OB挡掉一样
class Integer {
int value = 0 ;
Integer
add ( rhs ) {
Integer result = new Integer(this) ;
result.value
-= rhs.value ;
}
}
不好意思,不会挡掉,编译器会很开心把他编出来。
看到没有?
只要举的例子够奇怪,你什麽都能证明,开玩笑的,
是不管你用什麽语言,你都没办法阻止脑残的程式设计师干出蠢事,
而且 d = ( a + b ) * ( c + d ) 就是比 d = a.add(b).mul(c.add(d)) 好读,
这点不是我自己在讲的,有个极端反对 operator overloading 的语言也赞成我,
怎麽说?因为 Java 下一版也要内建 BigNumber 的 operator overloading 了 ~_~"
连抱持这个观点到极限的 Java 都弃守了,C# 也早就不鸟 Java 那套说词了。
所以不要再自己用手打一堆自己平常写程式都不可能写出的烂 code 来当作例子,
举那些例子唯一能证明的就是举例的人自己会写出这麽烂的 code,不是别人。
让我这样说吧:
你的 C++ 可能不好读,别人的可不是。
3. 物件导向不适合底层程式(或是没办法跟底层衔接)
那个问 ASM 跟 C++ 接合的,你不会不代表没办法,Google 一下就有答案,
link 找不到东西那是因为 C++ 为了 overloading 会作 decorated name,
不知道 decorated name 就去 google,不想看英文的,
可以去 bs2 program 版搜标题「使用 dll 问题??」。
而且幸运的事 C++ 不是纯物件导向语言。
当你发现某个地方适合 procedual paradigm 的时候,就用 procedual paradigm,
当你觉得某种型态适合 generic paradigm 的时候,就用 generic paragigm,
当你觉得某个架构适合 Object based paradigm 的时候,just do it!
没人有人强迫你用 C++ 的时候一定要用 Ojbect Oriented paradigm。
(Java 才有这样的强迫症:P)
以上几种设计典型又没有冲突,一个大型程式一定会每一种都用到。
(如果你知道怎麽用的话,一定每种都会用到,
如果有人只会 procedual,那赶快多学一点)
4. C++ 的复杂度太高
只有这点是真的,
所以请大家不要学 C++,去学 Python 或是 Ruby。
Python 多美好阿,我现在几乎都写 Python 了呢 ="=
--
To iterate is human, to recurse is divine.
递回只应天上有, 凡人该当用回圈. L. Peter Deutsch
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.105.151
1F:推 zlw:推第4点,前面一大串讨论,没几篇看得懂 03/08 17:17
2F:→ tinlans:其实我们做 compiler 的最怕的是 user 自己写的 code,因 03/08 17:23
3F:→ tinlans:为猜不出哪些能最佳化哪些不行;同样的功能 C 是人写的, 03/08 17:23
4F:→ tinlans:C++ 是 compiler 帮你生的,compiler 当然很清楚自己生的 03/08 17:24
5F:→ tinlans:code 是要做什麽,自然也知道那些自己生出来的东西能不能 03/08 17:24
6F:→ tinlans:合并或砍掉。 03/08 17:24
7F:→ tinlans:所以我反而无法理解那些强调用 C 写效能会好的论点。 03/08 17:25
8F:→ tinlans:关於 4.,我现在是常用 SWIG 把 C++ 接到其它语言去 XD 03/08 17:30
9F:→ karcher:推python~~ 03/08 19:21
10F:推 StubbornLin:python赞 03/08 19:35
11F:推 Tiberius:Py_Initialize(); // XD 03/08 19:49
12F:→ softwind:Python推 不过这边是C_AND_CPP版 呵呵呵 03/08 20:39
13F:→ jaw109:"再优雅的程式语言也不能阻止programmer写出烂程式" 03/08 23:39
14F:→ jaw109:忘记是在哪里看到的了..... 03/08 23:41
15F:推 Romulus:我要推Ruby qq 03/09 12:49
16F:推 henry666666:推一下有口皆碑 03/09 21:57