0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么样的代码会被编译器优化

学益得智能硬件 ? 来源:学益得智能硬件 ? 2025-01-16 16:38 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

现在的编译器有多智能,可能你辛辛苦苦写的代码,在编译器看来就是几句废话,直接被删除掉。

以 gcc 编译器为例,编译的时候可以加上 -O 选项来优化代码,优化等级从 0 到 3。

写一些简单的代码给大家演示下。

#include 


void delay()
{
    for (int i = 0; i < 40000; i++)
        for (int j = 0; j < 10000; j++);
}


int main()
{
    printf("helloworld
");


    delay();


    printf("helloworld
");
    
    return 0;
}

比如在两条输出语句之间加上延时,正常的现象是这样的,很明显,延时函数起了作用。

如果编译的时候加上 O1 优化选项,在编译器看来,delay 函数什么事都没干,可以直接删掉。

比较两者的汇编代码,就能看出开启 O1 优化后,主函数中没有调用 delay,运行的现象也确实没有延时。

再比如这样的代码,test 函数直接返回了 1234。

如果不开启优化,主函数会调用 test 函数,如果开启了优化,编译器会跳过调用 test 函数,直接取他的返回值来使用。

再来看下 O2 优化级别,比如这个代码:

#include 


void test()
{
    printf("helloworld
");
}


int main()
{
    for (int i = 0; i < 3; i++)
    {   
        test();
    }   


    return 0;
}

循环调用 test 函数,test 函数也只是简单的使用 printf 输出字符串。

三份汇编代码分别对应三个不同的优化级别,没开优化,O1 优化,O2 优化。

没开优化的时候,汇编代码就是对应 C 代码,有循环,循环中调用 test 函数。

开启 O1 优化,循环没了,直接调用三次 test 函数,因为循环确实浪费时间。

开启 O2 优化,这次直接把 test 函数跳过,主函数中直接调用 puts 函数,这里的 puts ,就是 printf 优化而来,前面讲过,使用 printf 直接输出字符串,编译器会默认优化成 puts。

最后还有一个级别是 O3,O3 在 O2 的基础上优化更深。不过关于 O3 的优化并没有找到简短的代码,这里就不给大家做演示。

在平时的学习中并不建议使用编译器的优化策略,尤其是更高级别的优化,为了提升代码的运行效率,很多时候编译器会调整代码结构,导致运行的结果跟我们预期不一样。作为初学者,知道有这么回事就行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4384

    浏览量

    65132
  • 代码
    +关注

    关注

    30

    文章

    4905

    浏览量

    70995
  • 编译器
    +关注

    关注

    1

    文章

    1663

    浏览量

    50348

原文标题:什么样的代码会被编译器优化

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何编写有利于编译器优化代码

    对于嵌入式系统,最终代码的体积和效率取决于由编译器生成的可执行代码,而非开发人员编写的源代码;但是源代码
    发表于 11-09 10:31 ?1544次阅读
    如何编写有利于<b class='flag-5'>编译器</b><b class='flag-5'>优化</b>的<b class='flag-5'>代码</b>

    请问是否有关于类似编译器或者堆栈的文档,或者编译器自动压栈个数所依据的规则是什么样的?

    入栈大小与入参的个数、入参的类型甚至编译器优化开的优化级别都有关系。因此想问一下是否有关于类似编译器或者堆栈的文档,或者编译器自动压栈个数所
    发表于 06-25 02:26

    SIMD计算机的优化编译器设计

    利用处理的相关资源,提高编译器优化性能和增强代码可适应性是SIMD处理优化
    发表于 04-03 08:47 ?30次下载

    Keil C编译器编程规则和代码优化

    本内容介绍了Keil C编译器编程规则和代码优化,要实用好单片机就必须清楚它的内部结构组织结构,无论是在芯片的选择还是代码的编写
    发表于 04-20 17:37 ?315次下载
    Keil C<b class='flag-5'>编译器</b>编程规则和<b class='flag-5'>代码</b><b class='flag-5'>优化</b>

    编译器_keil的优化选项问题

    keil编译器优化选项针对ARM,对STM32编译的一些优化的问题
    发表于 02-25 14:18 ?3次下载

    C编译器及其优化

    本章将帮助读者在ARM处理上编写高效的C代码。本章涉及的一些技术不仅适用于ARM处理,也适用于其他RISC处理。本章首先从ARM编译器
    发表于 10-17 17:22 ?2次下载

    编译器优化对函数的影响

    编译器如gcc,可以指定不同的优化参数,在某些条件下,有些函数可能会被优化掉。
    的头像 发表于 06-22 14:58 ?3133次阅读
    <b class='flag-5'>编译器</b><b class='flag-5'>优化</b>对函数的影响

    如何编写有利于编译器优化代码

    对于嵌入式系统,最终代码的体积和效率取决于由编译器生成的可执行代码,而非开发人员编写的源代码;但是源代码
    的头像 发表于 03-29 15:58 ?2092次阅读
    如何编写有利于<b class='flag-5'>编译器</b><b class='flag-5'>优化</b>的<b class='flag-5'>代码</b>

    编译器如何对代码进行优化(上)

    在学习 Andorid 逆向的过程中,发现无论是哪种编译器,生成哪个平台的代码,其优化思路在本质上如出一辙,在 Windwos 平台所使用的技巧,在安卓平台仍然适用,不外乎乘法除法计算的优化
    的头像 发表于 02-01 16:25 ?1192次阅读

    编译器如何对代码进行优化(下)

    在学习 Andorid 逆向的过程中,发现无论是哪种编译器,生成哪个平台的代码,其优化思路在本质上如出一辙,在 Windwos 平台所使用的技巧,在安卓平台仍然适用,不外乎乘法除法计算的优化
    的头像 发表于 02-01 16:25 ?1098次阅读
    <b class='flag-5'>编译器</b>如何对<b class='flag-5'>代码</b>进行<b class='flag-5'>优化</b>(下)

    编译器优化选项

    一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,第一,必须选择合适的算法和数据结构;第二,应该编写编译器能够有效优化以转换成高效可执行代码的源代码
    的头像 发表于 11-24 15:37 ?1412次阅读
    <b class='flag-5'>编译器</b>的<b class='flag-5'>优化</b>选项

    Keil编译器优化方法

    我们都知道,代码是可以通过编译器优化的,有的时候,为了提高运行速度或者减少代码尺寸,会开启优化选项。
    的头像 发表于 10-23 16:35 ?2179次阅读
    Keil<b class='flag-5'>编译器</b><b class='flag-5'>优化</b>方法

    Triton编译器与其他编译器的比较

    的GPU编程框架,使开发者能够编写出接近手工优化的高性能GPU内核。 其他编译器 (如GCC、Clang、MSVC等): 定位:通用编译器,支持多种编程语言,广泛应用于各种软件开发场景。 目标:提供稳定、高效的
    的头像 发表于 12-24 17:25 ?1052次阅读

    Triton编译器优化技巧

    在现代计算环境中,编译器的性能对于软件的运行效率至关重要。Triton 编译器作为一个先进的编译器框架,提供了一系列的优化技术,以确保生成的代码
    的头像 发表于 12-25 09:09 ?1080次阅读

    Triton编译器如何提升编程效率

    在现代软件开发中,编译器扮演着至关重要的角色。它们不仅将高级语言代码转换为机器可执行的代码,还通过各种优化技术提升程序的性能。Triton 编译器
    的头像 发表于 12-25 09:12 ?788次阅读