设为首页 收藏本站
查看: 122|回复: 0

[经验分享] 我用 C++ 编码多年后发现的8个C++性能技巧

[复制链接]
累计签到:50 天
连续签到:1 天
发表于 2025-2-17 14:39:35 | 显示全部楼层 |阅读模式
嘿,大家好!在使用C++多年之后,我觉得应该分享一些性能方面的小窍门,它们在很多情况下都帮了我的大忙。以下就是实实在在提升了我各个项目性能的八点建议。别忘了收藏这篇文章哦——你可能会需要回顾一下这些内容呢!

1.明智地使用智能指针
在C++中管理内存可能相当棘手。像std::unique_ptrstd::shared_ptr这样的指针非常有用,但是过度使用std::shared_ptr可能会因引用计数而产生额外开销。
不要这样做:
std::shared_ptr<MyClass> ptr(new MyClass());试试这样:
auto ptr = std::make_unique<MyClass>();我记得在一个项目中,当我把一些shared_ptr替换成unique_ptr的时候——就好像我的应用程序深吸了一口气然后放松下来了一样。
突发奇想:有时候我会想,C++这门语言是不是设计来让我们保持谦逊的呀。正当你觉得自己已经搞懂它的时候,砰——就出现未定义行为了。


2.利用移动语义尽量减少复制
复制大型对象是一种隐蔽的性能杀手。在C++11及之后的版本中,移动语义可以通过“移动”资源来帮助你避免不必要的复制。
不要这样做:
std::vector<MyClass> vec;vec.push_back(someLargeObject); // 复制对象试试这样:
std::vector<MyClass> vec;vec.push_back(std::move(someLargeObject)); // 移动对象我以前一直没重视移动语义,直到我意识到我的程序慢得像蜗牛爬坡一样。采用std::move后,情况就大为改观了。

3.为vector预留内存
如果你知道std::vector中大概需要多少元素,提前预留内存可以通过减少重新分配内存的次数来节省时间。
不要这样做:
std::vector<int> data;for (int i = 0; i < n; ++i) {    data.push_back(i);}试试这样:
std::vector<int> data;data.reserve(n);for (int i = 0; i < n; ++i) {    data.push_back(i);}


4.优先使用前缀自增而非后缀自增
当使用迭代器或简单的计数器时,使用前缀自增(++i)可能会比后缀自增(i++)稍微更高效一些,特别是对于复杂的迭代器类型来说。
不要这样做:
for (auto it = container.begin(); it!= container.end(); it++) {    // 执行某些操作}试试这样:
for (auto it = container.begin(); it!= container.end(); ++it) {    // 执行某些操作}这可能看起来有点吹毛求疵,但在紧密的循环中,每一微秒都很重要。


5.在不必要时避免使用虚函数
虚函数会因动态分派而增加开销。如果你不需要多态行为,就别用virtual关键字了。
不要这样做:
class Base {public:    virtual void doSomething();};试试这样:
class Base {public:    void doSomething();};我曾经把我所有类的方法都加上virtual关键字“以防万一”——大错特错啊。我的程序性能一落千丈。

6.谨慎使用异常处理
异常功能很强大,但如果过度使用可能成本很高,特别是在对性能要求苛刻的代码中。要明智地使用它们。
不要这样做:
try {    // 可能抛出异常的代码} catch (const std::exception& e) {    // 处理异常}如果合适的话,可以考虑采用其他错误处理方式。
我可是吃了大亏才明白这个道理的,当时我的实时应用程序就因为过度的异常处理开始出现卡顿了。
**突发奇想:**有时候我真希望生活也有个try-catch块呢。忘了带钥匙?捕获那个异常然后继续前行呀!

7.利用编译时多态
模板和内联函数可以帮助你实现多态,同时又不会有虚函数带来的运行时开销。
示例:
template <typename T>void process(T& obj) {    obj.doSomething();}这样可以利用编译器来生成代码,从而降低运行时成本。

8.在优化之前先进行性能分析
这虽然不是一个直接的编码技巧,但却至关重要。在做出更改之前,使用性能分析工具来确定瓶颈所在。
可用的工具比如:
  • gprof
  • Valgrind
  • Visual Studio Profiler

我都数不清有多少次自己瞎猜性能问题出在哪儿,结果完全猜错了。性能分析可是能节省时间,还能让你保持清醒理智呢。
突发奇想:这就好比去看医生——你可能觉得自己知道哪儿出问题了,但诊断结果才会告诉你真实情况呀。
这些就是我在多年C++编程生涯中学到的一些经验教训。每个项目都是独一无二的,所以要相应地进行合理设计。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1005683-1-1.html 上篇帖子: 谁还不知道这个嘎嘎厉害的C++构建工具! 下篇帖子: 解锁 C++ 新姿势:走进 21 世纪的 C++ 编程世界
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表