0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編譯器如何對代碼進行優(yōu)化(上)

jf_78858299 ? 來源:看雪論壇 彼岸風 ? 作者:看雪論壇 彼岸風 ? 2023-02-01 16:25 ? 次閱讀

在學習 Andorid 逆向的過程中,發(fā)現(xiàn)無論是哪種編譯器,生成哪個平臺的代碼,其優(yōu)化思路在本質(zhì)上如出一轍,在 Windwos 平臺所使用的技巧,在安卓平臺仍然適用,不外乎乘法除法計算的優(yōu)化,swtich 判定樹的優(yōu)化,對 if 條件句的優(yōu)化,while 循環(huán)的優(yōu)化等等,編寫本文的目的也就是為了對已學的知識進行總結(jié)。

這里強烈推薦老錢和老張寫的《C++匯編與逆向分析技術(shù)揭秘》,本文大部分知識點都將以此書作為參考,我個人是不太喜歡看直播和視屏教程的,因為有些關(guān)鍵知識點可能老師一句話就帶過去了,要想回來看還得來回拉進度條,但是書不一樣,遇到讀不懂的地方可以停下來仔細思考,想回頭看也就是翻幾頁的事情,遇到那種寫的特別細的作者,那讀起來更是一種享受。

本文列舉的代碼和匯編只是為了更好的說明思路,并不代表實際代碼,好了話不多說,進入正題。

優(yōu)化方向

  • 編譯速度優(yōu)化
  • 執(zhí)行速度優(yōu)化
  • 程序體積優(yōu)化

對于 Debug 版程序,編譯器為了滿足單步調(diào)試需求,不會對無意義的代碼進行優(yōu)化。無意義的意思是沒有發(fā)生傳遞,沒有賦值到內(nèi)存空間。



常見的優(yōu)化類型

常量折疊

更像是預(yù)處理,編譯器會將所有可預(yù)見的值直接寫成立即數(shù)。

int n = 2 + 3 * 6;
// 編譯器在處理這段代碼時會直接將變量賦予立即數(shù)+
// mov n, 20

常量傳播

是常量折疊的“進階版”,編譯器會掃描整個代碼段,對所有非變量運算直接計算出結(jié)果。

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

減少變量

未使用即是無意義,無意義的代碼都會被優(yōu)化,上述的兩個示例,在實際編譯中是會直接被優(yōu)化掉的,因為并未被用于函數(shù)傳參和其他操作。

編譯雖然能通過,但不會產(chǎn)生任何代碼,因為沒有傳遞結(jié)果,對后續(xù)的代碼執(zhí)行不會造成任何影響。

int funtion1() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return 0;
}
// 無意義的變量,這個函數(shù)被編譯為匯編也將只有一句代碼
// mov eax, 0

int funtion2() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return m;
}
// 有意義的變量,但因為常量傳播,也只有一句代碼
// mov eax, 200

## 分支優(yōu)化

對于所有不可達的分支也會直接被裁剪。

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

在書中還有更多優(yōu)化示例,這里不做過多列舉,其根本就是以上幾種優(yōu)化方式,無意義的代碼將被刪除,冗余的代碼將會被精簡,照著這種思路想就對了。得益于編譯器的強大,使得再爛的代碼也能保持高效。



數(shù)學計算上對算法的優(yōu)化

我將會穿插使用 x86 和 arm 匯編,主要指令都大差不差,理解意義即可。

加法

加法沒有任何優(yōu)化空間,一個 add 指令所需的 cpu 周期本就很短,除了上述的常量折疊外,一般不會對其進行改動。

減法

理論上加法和減法的指令周期是一致的,也不排除有些編譯器會將減數(shù)轉(zhuǎn)成補碼進行相加,遇到補碼也能一眼看出來,直接就可以認定這條指令為減法。

乘法

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4801

    瀏覽量

    68731
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1636

    瀏覽量

    49172
  • Andorid
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    6998
收藏 人收藏

    評論

    相關(guān)推薦

    如何編寫有利于編譯器優(yōu)化代碼

    對于嵌入式系統(tǒng),最終代碼的體積和效率取決于由編譯器生成的可執(zhí)行代碼,而非開發(fā)人員編寫的源代碼;但是源代碼
    發(fā)表于 11-09 10:31 ?1415次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>的<b class='flag-5'>代碼</b>

    SIMD計算機的優(yōu)化編譯器設(shè)計

    利用處理的相關(guān)資源,提高編譯器優(yōu)化性能和增強代碼可適應(yīng)性是SIMD處理優(yōu)化
    發(fā)表于 04-03 08:47 ?30次下載

    Keil C編譯器編程規(guī)則和代碼優(yōu)化

    本內(nèi)容介紹了Keil C編譯器編程規(guī)則和代碼優(yōu)化,要實用好單片機就必須清楚它的內(nèi)部結(jié)構(gòu)組織結(jié)構(gòu),無論是在芯片的選擇還是代碼的編寫
    發(fā)表于 04-20 17:37 ?315次下載
    Keil C<b class='flag-5'>編譯器</b>編程規(guī)則和<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>

    編譯器_keil的優(yōu)化選項問題

    keil編譯器優(yōu)化選項針對ARM,對STM32編譯的一些優(yōu)化的問題
    發(fā)表于 02-25 14:18 ?3次下載

    C編譯器及其優(yōu)化

    本章將幫助讀者在ARM處理編寫高效的C代碼。本章涉及的一些技術(shù)不僅適用于ARM處理,也適用于其他RISC處理。本章首先從ARM
    發(fā)表于 10-17 17:22 ?2次下載

    編譯器優(yōu)化對函數(shù)的影響

    編譯器如gcc,可以指定不同的優(yōu)化參數(shù),在某些條件下,有些函數(shù)可能會被優(yōu)化掉。
    的頭像 發(fā)表于 06-22 14:58 ?2847次閱讀
    <b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>對函數(shù)的影響

    如何編寫有利于編譯器優(yōu)化代碼

    對于嵌入式系統(tǒng),最終代碼的體積和效率取決于由編譯器生成的可執(zhí)行代碼,而非開發(fā)人員編寫的源代碼;但是源代碼
    的頭像 發(fā)表于 03-29 15:58 ?1493次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>的<b class='flag-5'>代碼</b>

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個架構(gòu)編譯另外一個架構(gòu)的代碼,相當于兩種架構(gòu)“交叉”起來了。Ubuntu 自帶的 gcc 編譯器是針對
    的頭像 發(fā)表于 09-29 09:12 ?3537次閱讀

    編譯器如何對代碼進行優(yōu)化(下)

    在學習 Andorid 逆向的過程中,發(fā)現(xiàn)無論是哪種編譯器,生成哪個平臺的代碼,其優(yōu)化思路在本質(zhì)如出一轍,在 Windwos 平臺所使用的技巧,在安卓平臺仍然適用,不外乎乘法除法計算
    的頭像 發(fā)表于 02-01 16:25 ?861次閱讀
    <b class='flag-5'>編譯器</b>如何對<b class='flag-5'>代碼</b><b class='flag-5'>進行</b><b class='flag-5'>優(yōu)化</b>(下)

    編譯器優(yōu)化選項

    一個程序首先要保證正確性,在保證正確性的基礎(chǔ),性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu);第二,應(yīng)該編寫編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可執(zhí)行代碼
    的頭像 發(fā)表于 11-24 15:37 ?921次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優(yōu)化</b>選項

    Keil編譯器優(yōu)化方法

    我們都知道,代碼是可以通過編譯器優(yōu)化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優(yōu)化選項。
    的頭像 發(fā)表于 10-23 16:35 ?648次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>方法

    Triton編譯器與其他編譯器的比較

    的GPU編程框架,使開發(fā)者能夠編寫出接近手工優(yōu)化的高性能GPU內(nèi)核。 其他編譯器 (如GCC、Clang、MSVC等): 定位:通用編譯器,支持多種編程語言,廣泛應(yīng)用于各種軟件開發(fā)場景。 目標:提供穩(wěn)定、高效的
    的頭像 發(fā)表于 12-24 17:25 ?386次閱讀

    Triton編譯器優(yōu)化技巧

    在現(xiàn)代計算環(huán)境中,編譯器的性能對于軟件的運行效率至關(guān)重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼
    的頭像 發(fā)表于 12-25 09:09 ?237次閱讀

    Triton編譯器如何提升編程效率

    開發(fā)者能夠更快地開發(fā)出更高效的軟件。 1. 代碼優(yōu)化 1.1 編譯優(yōu)化 Triton 編譯器編譯
    的頭像 發(fā)表于 12-25 09:12 ?239次閱讀

    Triton編譯器與GPU編程的結(jié)合應(yīng)用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優(yōu)化編譯器,它能夠自動將高級語言代碼轉(zhuǎn)換為針對特定硬件
    的頭像 發(fā)表于 12-25 09:13 ?246次閱讀