arm-linux-gnueabihf-g++ gcc編譯、優化命令 匯總

gcc優化選項,可在編譯時間,目標文件長度,執行效率三個維度,進行不同的取舍和平衡。

gcc 常用編譯選項

arm-linux-gnueabihf-g++ -O3 -march=armv7-a -mcpu=cortex-a9 -ftree-vectorize -mfpu=neon -mfpu=vfpv3-fp16 -mfloat-abi=hard -ffast-math 

-c 只編譯并生成目標文件。
-E 只運行 C 預編譯器。
-g 生成調試信息。GNU 調試器可利用該信息。
-Os 相對語-O2.5。
-o FILE 生成指定的輸出文件。用在生成可執行文件時。
-O0 不進行優化處理。
-O 或 -O1 優化生成代碼。
-O2 進一步優化。
-O3 比 -O2 更進一步優化,包括 inline 函數。
-shared 生成共享目標文件。通常用在建立共享庫時。
-W 開啟所有 gcc 能提供的警告。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

優化O0,O, O2, O3

These options control various sorts of optimizations.

Without any optimization option, the compiler’s goal is to reduce the cost of compilation and to make debugging produce the expected results. Statements are independent: if you stop the program with a breakpoint between statements, you can then assign a new value to any variable or change the program counter to any other statement in the function and get exactly the results you would expect from the source code.

Turning on optimization flags makes the compiler attempt to improve the performance and/or code size at the expense of compilation time and possibly the ability to debug the program.

The compiler performs optimization based on the knowledge it has of the program. Using the -funit-at-a-time flag will allow the compiler to consider information gained from later functions in the file when compiling a function. Compiling multiple files at once to a single output file (and using -funit-at-a-time) will allow the compiler to use information gained from all of the files when compiling each of them.

Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed.

-O0

-O0: 不做任何優化,這是默認的編譯選項。

-O1

-O1:優化會消耗少多的編譯時間,它主要對代碼的分支,常量以及表達式等進行優化。

-O和-O1: 對程序做部分編譯優化,對于大函數,優化編譯占用稍微多的時間和相當大的內存。使用本項優化,編譯器會嘗試減小生成代碼的尺寸,以及縮短執行時間,但并不執行需要占用大量編譯時間的優化。 -O1打開的優化選項, 可參考最后的參考文獻。
Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function.
With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.

-O turns on the following optimization flags:

      -fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fdelayed-branch -fguess-branch-probability -fcprop-registers

-O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging.

-O2

-O2:會嘗試更多的寄存器級的優化以及指令級的優化,它會在編譯期間占用更多的內存和編譯時間。
Gcc將執行幾乎所有的不包含時間和空間折中的優化。當設置O2選項時,編譯器并不進行循環打開()loop unrolling以及函數內聯。
Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. The compiler does not perform loop unrolling or function inlining when you specify -O2. As compared to -O, this option increases both compilation time and the performance of the generated code.
-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags:

      -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps  -fcse-skip-blocks -frerun-cse-after-loop  -frerun-loop-opt -fgcse  -fgcse-lm  -fgcse-sm  -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns  -fschedule-insns2 -fsched-interblock  -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks  -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions  -falign-jumps -falign-loops  -falign-labels -fcrossjumping

Please note the warning under -fgcse about invoking -O2 on programs that use computed gotos.

-O3

-O3: 在O2的基礎上進行更多的優化。例如使用偽寄存器網絡,普通函數的內聯,以及針對循環的更多優化。在包含了O2所有的優化的基礎上,又打開了以下優化選項:
l -finline-functions:內聯簡單的函數到被調用函數中。
l -fweb:構建用于保存變量的偽寄存器網絡。 偽寄存器包含數據, 就像他們是寄存器一樣, 但是可以使用各種其他優化技術進行優化, 比如cse和loop優化技術。這種優化會使得調試變得更加的不可能,因為變量不再存放于原本的寄存器中。
l -frename-registers:在寄存器分配后,通過使用registers left over來避免預定代碼中的虛假依賴。這會使調試變得非常困難,因為變量不再存放于原本的寄存器中了。
l -funswitch-loops:將無變化的條件分支移出循環,取而代之的將結果副本放入循環中。

-Os

-Os:相當于-O2.5。是使用了所有-O2的優化選項,但又不縮減代碼尺寸的方法。
Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.
-Os disables the following optimization flags:

      -falign-functions  -falign-jumps  -falign-loops -falign-labels  -freorder-blocks  -fprefetch-loop-arrays

If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.

Reference

  1. gcc Options That Control Optimization
  2. gcc編譯優化-O0 -O1 -O2 -O3 -OS說明

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40958.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js的FileSaver.saveAs()方法:監聽保存進度,進度條等方法

在使用FileSaver.saveAs保存表格到本地時,如果想要獲取導出/保存進度可以如下操作 FileSaver.js的saveAs()方法是一個異步操作,它將文件保存到用戶設備上。在調用saveAs()方法后,可以通過使用回調函數、Promise、或監聽相關事件來確定saveAs(…

在vue中使用swiper輪播圖(搭配watch和$nextTick())

在組件中使用輪播圖展示圖片信息: 1.下載swiper,5版本為穩定版本 cnpm install swiper5 2.在組件中引入swiper包和對應樣式,若多組件使用swiper,可以把swiper引入到main.js入口文件中: import swiper/css/swiper.css //引入swipe…

SpringBoot系列---【SpringBoot在多個profiles環境中自由切換】

SpringBoot在多個profiles環境中自由切換 1.在resource目錄下新建dev,prod兩個目錄,并分別把dev環境的配置文件和prod環境的配置文件放到對應目錄下,可以在配置文件中指定激活的配置文件,也可以默認不指定。 2.在pom.xml中最后位置…

07微服務的事務管理機制

一句話導讀 在單體應用程序中,事務通常是在單個數據庫或單個操作系統中管理的,而在微服務架構中,事務需要跨越多個服務和數據庫,這就使得事務管理變得更加復雜和困難。 目錄 一句話導讀 一、微服務事務管理的定義和意義 二、微…

Layui列表表頭去掉復選框改為選擇

效果&#xff1a; 代碼&#xff1a; // 表頭復選框去掉改為選擇 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>選擇</span>");

做好以下幾點,可以讓我們延長周末體驗感,好好放松!!!

工作以后常常容易感到疲于奔命&#xff0c;讓我們找到適合自己方式&#xff0c;來讓我們度過一個充實放松的周末! 方向一&#xff1a;分享你周末的時間規劃 我們可以把每個月當做一個周期&#xff0c;制定一個簡單的計劃&#xff0c;如&#xff1a;第一周&#xff0c;鍛煉身體…

基于Prometheus監控Kubernetes集群

目錄 一、環境準備 1.1、主機初始化配置 1.2、部署docker環境 二、部署kubernetes集群 2.1、組件介紹 2.2、配置阿里云yum源 2.3、安裝kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安裝master節點 2.6、安裝node節點 2.7、安裝flannel、cni 2.8、部署測…

Go 1.21新增的內置函數(built-in functions)詳解

Go 1.21新增的內置函數分別是 min、max 和 clear&#xff0c;接下來看下這幾個函數的用途和使用示例。 在編程過程中&#xff0c;需要知道一組值中的最大或最小值的場景是很常見的&#xff0c;比如排序、統計等場景。之前都需要自己寫代碼來實現這個功能&#xff0c;現在 Go 1…

低成本無刷高速吹風機單片機方案

高速吹風機的轉速一般是普通吹風機的5倍左右。一般來說&#xff0c;吹風機的電機轉速一般為2-3萬轉/分鐘&#xff0c;而高速吹風機的電機轉速一般為10萬轉/分鐘左右。高轉速增加了高風速。一般來說&#xff0c;吹風機的風力只有12-17米/秒&#xff0c;而高速吹風機的風力可以達…

安卓獲取當前的IP地址

文章目錄 獲取IP地址完整示例代碼 獲取IP地址 在安卓中&#xff0c;我們使用靜態方法NetworkInterface.getNetworkInterfaces() 來獲取當前設備上所有的網絡接口。 網絡接口是指設備上用于進行網絡通信的硬件或軟件。這些接口可以是物理接口&#xff08;如以太網接口、無線網…

使用Docker搭建MySQL主從復制(一主一從)

Docker安裝MySQL docker pull mysql:5.7 docker images mysql安裝步驟 1.新建主服務器容器實例3307 docker run -p 3307:3306 --name mysql-master -v /usr/local/docker/mysql5.7/data/mysql-master/logs:/var/log/mysql -v /usr/local/docker/mysql5.7/data/mysql-master/…

Day 31 C++ STL常用算法(下)

文章目錄 常用拷貝和替換算法copy——容器內指定范圍的元素拷貝到另一容器中函數原型注意——利用copy算法在拷貝時&#xff0c;目標容器要提前開辟空間示例 replace——將容器內指定范圍的第一個舊元素修改為新元素函數原型注意——replace只會替換區間內滿足條件的第一個舊元…

cve-2016-7193:wwlib 模塊堆數據結構溢出

簡介 漏洞編號&#xff1a;cve-2016-7193漏洞類型&#xff1a;堆溢出軟件名稱&#xff1a;Office模塊名稱&#xff1a;wwlib歷史漏洞&#xff1a;較多影響的版本 攻擊利用&#xff1a;APT 攻擊利器-Word 漏洞 CVE-2016-7193 原理揭秘 操作環境 系統&#xff1a;Win10 1607軟…

C++ 動態內存

C 動態內存 C 程序中的內存分為兩個部分&#xff1a; 棧&#xff1a;在函數內部聲明的所有變量都將占用棧內存堆&#xff1a;這是程序中未使用的內存&#xff0c;在程序運行時可用于動態分配內存 很多時候&#xff0c;無法提前預知需要多少內存來存儲某個定義變量中的特定信…

【Docker報錯】docker拉取鏡像時報錯:no such host

報錯信息 [rootSoft soft]# docker pull mysql Using default tag: latest Error response from daemon: Head "https://registry-1.docker.io/v2/library/mysql/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.80.2:53: no such host解決方法…

3D模型格式轉換工具如何與Parasolid集成?

概述 HOOPS Exchange包括一個 Parasolid 連接器&#xff0c;它允許 Parasolid 開發人員輕松地將 CAD 數據導入到活動的 Parasolid 會話中。如果源數據基于 Parasolid&#xff08;NX、Solid Edge 或 SolidWorks&#xff09;&#xff0c;則數據將按原樣導入。 這意味著您可以假…

主數據管理案例-某政務

1、 背景介紹及難點分析 近年來&#xff0c;我國在大數據發展方面持續發力&#xff0c;取得了明顯成效。但也要看到&#xff0c;目前我國大數據發展還存在“孤島化”“碎片化”等問題&#xff0c;無序參與過度與創新參與不足并存&#xff0c;導致大數據資源配置統籌不&#xff…

【C++】list容器

1.list基本概念 2.list構造函數 #include <iostream> using namespace std;#include<list> //鏈表list容器構造函數//輸出list鏈表 void printList(const list<int>& L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout &…

STM32入門學習之定時器PWM輸出

1.脈沖寬度調制PWM(Pulse Width Modulation)是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。PWM可以理解為高低電平的占空比&#xff0c;即輸出高電平時間與低電平時間的比值。PWM的應用是否廣泛&#xff0c;比如在步進電機的控制中&#xff0c;可以通過P…

【MySQL系列】-回表、覆蓋索引真的懂嗎

【MySQL系列】-回表、覆蓋索引真的懂嗎 文章目錄 【MySQL系列】-回表、覆蓋索引真的懂嗎一、MYSQL索引結構1.1 索引的概念1.2 索引的特點1.3 索引的優點1.4 索引的缺點 二、B-Tree與BTree2.1 B-Tree2.2 BTree2.3 B-Tree 與BTree樹的區別2.4 那么為什么InnoDB的主鍵最好要搞成有…