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

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

3天内不再提示

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

jf_78858299 来源:看雪论坛 彼岸风 作者:看雪论坛 彼岸风 2023-02-01 16:25 次阅读

在学习 Andorid 逆向的过程中,发现无论是哪种编译器,生成哪个平台的代码,其优化思路在本质上如出一辙,在 Windwos 平台所使用的技巧,在安卓平台仍然适用,不外乎乘法除法计算的优化,swtich 判定树的优化,对 if 条件句的优化,while 循环的优化等等,编写本文的目的也就是为了对已学的知识进行总结。

这里强烈推荐老钱和老张写的《C++汇编与逆向分析技术揭秘》,本文大部分知识点都将以此书作为参考,我个人是不太喜欢看直播和视屏教程的,因为有些关键知识点可能老师一句话就带过去了,要想回来看还得来回拉进度条,但是书不一样,遇到读不懂的地方可以停下来仔细思考,想回头看也就是翻几页的事情,遇到那种写的特别细的作者,那读起来更是一种享受。

本文列举的代码和汇编只是为了更好的说明思路,并不代表实际代码,好了话不多说,进入正题。

优化方向

  • 编译速度优化
  • 执行速度优化
  • 程序体积优化

对于 Debug 版程序,编译器为了满足单步调试需求,不会对无意义的代码进行优化。无意义的意思是没有发生传递,没有赋值到内存空间。



常见的优化类型

常量折叠

更像是预处理,编译器会将所有可预见的值直接写成立即数。

int n = 2 + 3 * 6;
// 编译器在处理这段代码时会直接将变量赋予立即数+
// mov n, 20

常量传播

是常量折叠的“进阶版”,编译器会扫描整个代码段,对所有非变量运算直接计算出结果。

int n = 2 + 3 * 6;
int m = n * 10;
// mov m, 200

减少变量

未使用即是无意义,无意义的代码都会被优化,上述的两个示例,在实际编译中是会直接被优化掉的,因为并未被用于函数传参和其他操作。

编译虽然能通过,但不会产生任何代码,因为没有传递结果,对后续的代码执行不会造成任何影响。

int funtion1() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return 0;
}
// 无意义的变量,这个函数被编译为汇编也将只有一句代码
// mov eax, 0

int funtion2() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return m;
}
// 有意义的变量,但因为常量传播,也只有一句代码
// mov eax, 200

## 分支优化

对于所有不可达的分支也会直接被裁剪。

if(false) {
    printf("you can't find me");
}

在书中还有更多优化示例,这里不做过多列举,其根本就是以上几种优化方式,无意义的代码将被删除,冗余的代码将会被精简,照着这种思路想就对了。得益于编译器的强大,使得再烂的代码也能保持高效。



数学计算上对算法的优化

我将会穿插使用 x86 和 arm 汇编,主要指令都大差不差,理解意义即可。

加法

加法没有任何优化空间,一个 add 指令所需的 cpu 周期本就很短,除了上述的常量折叠外,一般不会对其进行改动。

减法

理论上加法和减法的指令周期是一致的,也不排除有些编译器会将减数转成补码进行相加,遇到补码也能一眼看出来,直接就可以认定这条指令为减法。

乘法

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

    关注

    30

    文章

    4841

    浏览量

    69195
  • 编译器
    +关注

    关注

    1

    文章

    1642

    浏览量

    49336
  • Andorid
    +关注

    关注

    0

    文章

    7

    浏览量

    7024
收藏 人收藏

    评论

    相关推荐

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

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

    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次下载

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

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

    交叉编译器安装教程

    交叉编译器中“交叉”的意思就是在一个架构编译另外一个架构的代码,相当于两种架构“交叉”起来了。Ubuntu 自带的 gcc 编译器是针对
    的头像 发表于 09-29 09:12 3652次阅读

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

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

    编译器优化选项

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

    Keil编译器优化方法

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

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

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

    Triton编译器优化技巧

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

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

    开发者能够更快地开发出更高效的软件。 1. 代码优化 1.1 编译优化 Triton 编译器编译
    的头像 发表于 12-25 09:12 369次阅读

    Triton编译器与GPU编程的结合应用

    Triton编译器简介 Triton编译器是一种针对并行计算优化编译器,它能够自动将高级语言代码转换为针对特定硬件
    的头像 发表于 12-25 09:13 360次阅读

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

    现在的编译器有多智能,可能你辛辛苦苦写的代码,在编译器看来就是几句废话,直接被删除掉。
    的头像 发表于 01-16 16:38 209次阅读