首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常规C++性能改进提示

常规C++性能改进提示
EN

Stack Overflow用户
提问于 2010-01-09 03:37:13
回答 24查看 31.2K关注 0票数 53

谁能给我推荐一篇文章,或者在这里写一些关于C++编程习惯的技巧,这些习惯通常是有效的(没有真正的缺点),并提高了性能?我不是指编程模式和算法复杂性--我需要一些小事情,比如你如何定义你的函数,在循环中做什么/避免什么,在堆栈上分配什么,在堆上分配什么,等等。

它不是关于让特定的软件更快,也不是关于如何创建一个干净的软件设计,而是关于编程习惯-如果你总是应用它们,你会让你的代码变得更快,而不是稍微慢一点。

EN

回答 24

Stack Overflow用户

发布于 2010-01-09 03:47:10

Effective C++More Effective C++Effective STLC++ Coding Standards中的许多技巧都是这样的。

此类技巧的一个简单示例:尽可能使用前置增量(++i)而不是后置增量(i++)。这对于迭代器尤其重要,因为后增量涉及复制迭代器。您的优化器可能能够撤销这一点,但是编写预增量并不是任何额外的工作,所以为什么要冒这个风险呢?

票数 36
EN

Stack Overflow用户

发布于 2010-01-09 03:48:51

如果我理解正确的话,您问的是关于避免过早优化的问题,这是对避免过早优化的一个很好的补充。根据我的经验,要避免的第一件事就是尽可能不复制大对象。这包括:

通过(const)引用传递对象到functions

  • return objects by (const)引用只要可行

  • 确保在需要时声明引用变量

最后这一点需要一些解释。我都说不清我见过多少次了:

代码语言:javascript
复制
class Foo
{
    const BigObject & bar();
};

// ... somewhere in code ...
BigObject obj = foo.bar();  // OOPS!  This creates a copy!

正确的方法是:

代码语言:javascript
复制
const BigOject &obj = foo.bar();  // does not create a copy

这些准则适用于任何比智能指针或内置类型更大的对象。此外,我强烈建议花时间学习profile your code。一个好的分析工具将有助于捕获浪费的操作。

票数 31
EN

Stack Overflow用户

发布于 2010-01-09 04:10:55

下面是我最恼火的几点:

  1. 在使用/初始化对象变量之前,不要声明(实际上是定义)对象变量(就像在C中一样)。这就需要运行构造函数和赋值运算符函数,对于复杂的对象来说,这可能是代价高昂的。
  2. 更喜欢前增量而不是后增量。这只对迭代器和带有重载操作符的用户定义类型有影响。
  3. 尽可能使用最小的原语类型。不要使用long int来存储范围为0..5的值。这将减少总体内存使用量,从而改善局部性,从而仅在必要时才改善整体performance.
  4. Use堆内存(动态分配)。许多C++程序员默认使用堆。动态分配和释放是使用临时( expensive.
  5. Minimize )(特别是使用基于字符串的处理)。Stroustrup在"The C++ Programming Language."
  6. Know your compiler/linker options“中提出了一种很好的技术,用于定义三元和高阶算术运算符的逻辑等价物。还要知道哪些因素会导致非标准行为。
  7. 不初始化变量、对象、容器等,当它们被无条件赋值时。
  8. 考虑复合条件的求值顺序。例如,给定if (a && b),如果b更有可能为false,则将其放在第一位以保存对a的评估。

还有许多我不会提及的“坏习惯”,因为在实践中,现代编译器/优化器将消除这些不良影响(例如,返回值优化与按引用传递、循环展开等)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档