【发布时间】:2011-05-09 11:34:44
【问题描述】:
C++ 风格与性能 - 使用 C 风格的东西,这比一些 C++ 等价物更快,这是不好的做法吗?例如:
不要使用
atoi()、itoa()、atol()等!使用std::stringstream永远不要使用原始指针,而是使用智能指针 - 好的,它们真的很有用,每个人都知道,我知道,我一直在使用,我知道它们比原始指针好多少,但有时使用原始指针是完全安全的。为什么不呢? “不是 C++ 风格?
不要使用按位运算 - 太 C 风格?什么?为什么不呢,当你确定你在做什么的时候?例如 - 不要按位交换变量 (
a ^= b; b ^= a; a ^= b;) - 使用标准的 3 步交换。不要使用左移乘以二。等等等等。(好吧,这不是 C++ 风格与 C 风格的对比,但仍然是“不好的做法”)最后,最昂贵的——“不要使用 enum-s 来返回代码,它太 C 风格,对不同的错误使用异常”?为什么?好的,当我们谈论深层次的错误处理时——好的,但为什么总是这样呢?这有什么问题,例如 - 当我们谈论一个函数时,它返回不同的错误代码,而当错误处理只在调用第一个函数的函数中实现时?我的意思是 - 不需要在上层传递错误代码。异常是相当缓慢的,它们是exceptions用于特殊情况,而不是为了......美丽。
等等等等等等
好的,我知道良好的编码风格非常非常重要 Compiler optimizations 非常强大。但我也知道exceptions handling 有多贵,(一些)smart_pointers 是如何实现的,并且一直不需要 smart_ptr。我知道,例如,atoi 并不像@ 那样“安全” 987654329@ 是,但仍然......性能如何?
编辑:我不是在谈论一些非常困难的事情,它们只是特定于 C 风格的。我的意思是——不要怀疑使用函数指针或虚拟方法和这类东西,C++ 程序员可能不知道,如果从未使用过这些东西(而 C 程序员一直这样做)。我说的是一些更常见、更简单的东西,比如在例子中。
【问题讨论】:
-
除非您在硬实时系统上工作,否则程序员的时间比 CPU 时间更宝贵。
-
@Ignacio Vazquez-Abrams :目前,我正在实时系统上工作,每秒处理大量消息/流量,但我仍然一直被告知 - “不要这样做,它是 c 风格的”.. 另外,你对程序员的时间完全正确,我同意你的观点,但是使用
atoi(例如)并不比使用std::stringstream花费更多的时间。 -
-
即使在最关键的应用程序中,像这样的微优化也很少产生可衡量的差异,但几乎总是使用正确的算法和数据结构才能产生差异。如今,随着多核系统正确有效地使用锁定以及编写缓存友好代码
-
只是一个适合您的案例研究。我也在实时系统上工作。我的同事经常嘲笑我大量使用“太空时代”C++ 构造,如模板、异常、字符串流等。但是当我的代码与以 C 风格编写的类似代码相比时,我的代码注重效率,我的代码通常更快。即使没有微优化。而且我的代码几乎从未从 Q/A 中返回给我,因为它有效——无论是第一次,还是后来发生变化时。高度“优化”的 C 代码不能这么说。它很脆,不喜欢变化。
标签: c++ c performance coding-style