前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >为什么你的代码优化前后似乎没有差别?编译器优化了解一下!

为什么你的代码优化前后似乎没有差别?编译器优化了解一下!

作者头像
码事漫谈
发布2024-12-20 11:25:24
发布2024-12-20 11:25:24
14400
代码可运行
举报
文章被收录于专栏:设计模式设计模式
运行总次数:0
代码可运行

过程描述

我们的代码在变成可执行文件之前,会经历两步优化。编译器优化和代码优化。

我们以g++编译为例看下面编译器优化的例子:

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
using namespace std;

class HasPtrMen {
public:
    int *d;
    static int n_cstr;
    static int n_dstr;
    static int n_cptr;
    HasPtrMen(): d(new int(0)) {
        cout << "constructor: " << ++n_cstr << endl;
    }
    HasPtrMen(const HasPtrMen &h) : d(new int(*h.d)) {
        cout << "copy constructor: " << ++n_cptr << endl;
    }
    ~HasPtrMen() {
        cout << "destructor: " << ++n_dstr << endl;
    }
};
int HasPtrMen::n_cstr = 0;
int HasPtrMen::n_dstr = 0;
int HasPtrMen::n_cptr = 0;
HasPtrMen GetTemp() { return HasPtrMen(); }

int main() {
    HasPtrMen a = GetTemp();
    return 0;
}

g++正常编译后输出结果如下:

这和我们所学知识是矛盾的!不应该如此,我自己还没有给该引用的地方加引用呢!

我们试试不优化后输出结果是什么:

图片
图片

对!它如下所示,中间详细的过程如下:

  1. 在调用GetTemp()时,HasPtrMen()被创建调用了构造函数(第一行输出)
  2. return时调用了拷贝构造,然后销毁,调用析构函数(第二三行输出)
  3. 来到外部看到=后将return的结果再次赋值给变量a,调用拷贝构造(第四行输出)
  4. return结果销毁,调用析构函数(第五行输出)
  5. 最后main函数结束,a对象销毁,调用析构函数(第六行输出)

结论

此时如果我们给GetTemp()的return结果加引用或进行其他优化,都基本收效甚微,因为在编译过程中,编译器已经给我们优化过了!

具体的优化逻辑和算法,我们不做讨论,只是我们需要知道有这样一个优化过程!除了编译器优化,文章开头还提到了代码优化,这里多说两句,我们知道C++代码编译分为预处理、编译、汇编、链接四个步骤!其中编译大体指的就是编译原理的内容,大概分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成这几步,代码优化就是在这个时候进行的,它是在编译过程中对生成的平台无关的中间代码进行通用优化的一个过程!

觉得文章不错,记得点赞、收藏,有任何问题欢迎评论探讨。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 过程描述
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档