C語言對于volatile與gcc優(yōu)化的探究
volatile是一個特征修飾符(type specifier) volatile的作用是作為指令關(guān)鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。這是百度百科的介紹,那編譯器是具體是怎么優(yōu)化的呢。
我們知道gcc 是有O0 O1 O2 O3的優(yōu)化等級的,其中O0優(yōu)化最低,O3優(yōu)化最高。
現(xià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
看的出來最低等級的優(yōu)化-O0 的執(zhí)行程序task_delay函數(shù)的匯編指令非常多,性能損耗長。
現(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)化的時候要少,提升了執(zhí)行速度。現(xiàn)在在來看下-O3的優(yōu)化后的反匯編代碼
看的出是直接空指令返回的,且運(yùn)行地址在1180在main函數(shù)是沒調(diào)用,這個暫時不知道怎么回事,交給后面的自己了,哈哈。
好了上面都是準(zhǔn)備工作,目的是告訴我們-O3能將程序優(yōu)化極致?,F(xiàn)在我們將count入?yún)⒂胿olatile修飾,會怎樣,根據(jù)百度百科的說法是不會進(jìn)行優(yōu)化的,我們測試下:
#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的匯編代碼一樣,沒進(jìn)行優(yōu)化。
到此這篇關(guān)于C語言對于volatile與gcc優(yōu)化的探究的文章就介紹到這了,更多相關(guān)C語言volatile與gcc內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中遞歸的實(shí)際應(yīng)用與經(jīng)典問題
函數(shù)以及函數(shù)的遞歸調(diào)用是學(xué)習(xí)C語言必須要掌握的內(nèi)容,且遞歸作為經(jīng)典的算法思想被廣泛應(yīng)用于程序設(shè)計中,下面這篇文章主要給大家介紹了關(guān)于C語言中遞歸的實(shí)際應(yīng)用與經(jīng)典問題的相關(guān)資料,需要的朋友可以參考下2021-09-09C語言實(shí)現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語言實(shí)現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼,支持文件夾、多級目錄的統(tǒng)計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下2014-08-08C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法
這篇文章主要介紹了C++ 將數(shù)據(jù)轉(zhuǎn)為字符串的幾種方法,十分的實(shí)用,有需要的小伙伴可以參考下。2015-06-06C語言中#define與typedef的互換細(xì)節(jié)詳解
本篇文章是對C語言中#define與typedef的互換細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05