C語(yǔ)言對(duì)于volatile與gcc優(yōu)化的探究
volatile是一個(gè)特征修飾符(type specifier) volatile的作用是作為指令關(guān)鍵字,確保本條指令不會(huì)因編譯器的優(yōu)化而省略,且要求每次直接讀值。這是百度百科的介紹,那編譯器是具體是怎么優(yōu)化的呢。
我們知道gcc 是有O0 O1 O2 O3的優(yōu)化等級(jí)的,其中O0優(yōu)化最低,O3優(yōu)化最高。
現(xiàn)在看下下面一段簡(jiǎn)單程序:
#include <stdio.h> void task_delay(int count) { count *= 50000; while(count--); } int main(int argc,char* argv[]) { printf("Task 0:Created!\n"); printf("Task 0:Running ...\n"); task_delay(1000); return 0; }
不用優(yōu)化編譯下:
gcc -g -O0 main.c
看下反匯編代碼:
objdump -d a.out
看的出來(lái)最低等級(jí)的優(yōu)化-O0 的執(zhí)行程序task_delay函數(shù)的匯編指令非常多,性能損耗長(zhǎng)。
現(xiàn)在看下O1的優(yōu)化后效果:
xc@xc-virtual-machine:~$ gcc -g -O1 main.c
xc@xc-virtual-machine:~$ objdump -d a.out
反匯編代碼:
明顯task_delay匯編指令比之前-O0優(yōu)化的時(shí)候要少,提升了執(zhí)行速度。現(xiàn)在在來(lái)看下-O3的優(yōu)化后的反匯編代碼
看的出是直接空指令返回的,且運(yùn)行地址在1180在main函數(shù)是沒(méi)調(diào)用,這個(gè)暫時(shí)不知道怎么回事,交給后面的自己了,哈哈。
好了上面都是準(zhǔn)備工作,目的是告訴我們-O3能將程序優(yōu)化極致?,F(xiàn)在我們將count入?yún)⒂胿olatile修飾,會(huì)怎樣,根據(jù)百度百科的說(shuō)法是不會(huì)進(jìn)行優(yōu)化的,我們測(cè)試下:
#include <stdio.h> void task_delay(volatile int count) { count *= 50000; while(count--); } int main(int argc,char* argv[]) { printf("Task 0:Created!\n"); printf("Task 0:Running ...\n"); task_delay(1000); return 0; }
xc@xc-virtual-machine:~$ gcc -g -O3 main.c
xc@xc-virtual-machine:~$
xc@xc-virtual-machine:~$
xc@xc-virtual-machine:~$ objdump -d a.out
發(fā)現(xiàn)跟-O0的匯編代碼一樣,沒(méi)進(jìn)行優(yōu)化。
到此這篇關(guān)于C語(yǔ)言對(duì)于volatile與gcc優(yōu)化的探究的文章就介紹到這了,更多相關(guān)C語(yǔ)言volatile與gcc內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中遞歸的實(shí)際應(yīng)用與經(jīng)典問(wèn)題
函數(shù)以及函數(shù)的遞歸調(diào)用是學(xué)習(xí)C語(yǔ)言必須要掌握的內(nèi)容,且遞歸作為經(jīng)典的算法思想被廣泛應(yīng)用于程序設(shè)計(jì)中,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中遞歸的實(shí)際應(yīng)用與經(jīng)典問(wèn)題的相關(guān)資料,需要的朋友可以參考下2021-09-09C語(yǔ)言實(shí)現(xiàn)控制臺(tái)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)控制臺(tái)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C語(yǔ)言實(shí)現(xiàn)的統(tǒng)計(jì)php代碼行數(shù)功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的統(tǒng)計(jì)php代碼行數(shù)功能源碼,支持文件夾、多級(jí)目錄的統(tǒng)計(jì),在一些環(huán)境中會(huì)用到這個(gè)功能,需要的朋友可以參考下2014-08-08C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法
這篇文章主要介紹了C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法,十分的實(shí)用,有需要的小伙伴可以參考下。2015-06-06C語(yǔ)言中#define與typedef的互換細(xì)節(jié)詳解
本篇文章是對(duì)C語(yǔ)言中#define與typedef的互換細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05