C語言對于volatile與gcc優(yōu)化的探究
volatile是一個特征修飾符(type specifier) volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。這是百度百科的介紹,那編譯器是具體是怎么優(yōu)化的呢。
我們知道gcc 是有O0 O1 O2 O3的優(yōu)化等級的,其中O0優(yōu)化最低,O3優(yōu)化最高。
現在看下下面一段簡單程序:
#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函數的匯編指令非常多,性能損耗長。
現在看下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í)行速度。現在在來看下-O3的優(yōu)化后的反匯編代碼
看的出是直接空指令返回的,且運行地址在1180在main函數是沒調用,這個暫時不知道怎么回事,交給后面的自己了,哈哈。
好了上面都是準備工作,目的是告訴我們-O3能將程序優(yōu)化極致。現在我們將count入參用volatile修飾,會怎樣,根據百度百科的說法是不會進行優(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ā)現跟-O0的匯編代碼一樣,沒進行優(yōu)化。
到此這篇關于C語言對于volatile與gcc優(yōu)化的探究的文章就介紹到這了,更多相關C語言volatile與gcc內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言實現的統計php代碼行數功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語言實現的統計php代碼行數功能源碼,支持文件夾、多級目錄的統計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下2014-08-08C語言中#define與typedef的互換細節(jié)詳解
本篇文章是對C語言中#define與typedef的互換細節(jié)進行了詳細的分析介紹,需要的朋友參考下2013-05-05