在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    4797

    瀏覽量

    68711
  • 編譯器
    +關注

    關注

    1

    文章

    1635

    瀏覽量

    49169
  • Andorid
    +關注

    關注

    0

    文章

    7

    瀏覽量

    6997
收藏 人收藏

    評論

    相關推薦

    如何編寫有利于編譯器優化代碼

    對于嵌入式系統,最終代碼的體積和效率取決于由編譯器生成的可執行代碼,而非開發人員編寫的源代碼;但是源代碼
    發表于 11-09 10:31 ?1414次閱讀
    如何編寫有利于<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次下載

    編譯器優化對函數的影響

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

    如何編寫有利于編譯器優化代碼

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

    交叉編譯器安裝教程

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

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

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

    編譯器優化選項

    一個程序首先要保證正確性,在保證正確性的基礎,性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數據結構;第二,應該編寫編譯器能夠有效優化以轉換成高效可執行代碼
    的頭像 發表于 11-24 15:37 ?917次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優化</b>選項

    Keil編譯器優化方法

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

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

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

    Triton編譯器優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼
    的頭像 發表于 12-25 09:09 ?232次閱讀

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

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

    Triton編譯器與GPU編程的結合應用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優化編譯器,它能夠自動將高級語言代碼轉換為針對特定硬件
    的頭像 發表于 12-25 09:13 ?241次閱讀
    主站蜘蛛池模板: 亚洲欧美性另类春色| 特黄特色三级在线播放| 毛片色毛片18毛片美女| www.午夜| 西西人体44renti大胆亚洲| 午夜精| 国产小视频你懂的| 男人的天堂一区二区视频在线观看| 一个综合色| 亚欧美视频| 国产精品臀控福利在线观看 | 欧美成年性色mmm| 欧美性幼| 福利视频免费观看| 日日操夜夜爽| 午夜资源| 免费一级毛片正在播放| 午夜神马| 亚洲色图17p| 天天干天天拍天天操| 午夜小视频男女在线观看| 天天干天天爽| 国产大片免费观看中文字幕| 69xxx欧美| 中文字幕一区二区视频| 欧美深深色噜噜狠狠yyy| 亚洲人成a在线网站| 一级一片免费视频播放| 高颜值美女啪啪| 欧美一区亚洲二区| 亚洲jizzjizz在线播放久| 亚洲人免费视频| 日本午夜三级| 欧美性天天影视| 欧美xxxxxbbbb| 欧美午夜场| 国产免费色视频| αv天堂| 97国产精品人人爽人人做| 在线视频播放大全| 午夜免费毛片|