編譯器優化對自定義延時程序的影響(volatile詳解實驗一)

由此可見(C語言volatile關鍵字詳解),編譯器優化會對自定義延時程序有影響,我們深入彙編程序去探討產生怎樣的影響!

首先是未加 volatie 使用和未使用編譯器優化彙編程序的對比:

有以下這麼一個源程序(delay.c):

#include <stdio.h>
void delay(long val);

int main(){
				
	delay(1000000);

	return 0;
}

void delay(long val){

	while(val--);
}

分別選擇編譯器優化(-O2)以及編譯器不優化(默認)進行彙編,對比彙編代碼:

編譯器優化:arm-linux-gcc -O2 -S -o delay_opt1.s delay.c

編譯器不優化:arm-linux-gcc -S -o delay.s delay.c

小結:

由彙編程序我們可以看到,優化之後的 delay 函數僅僅只有函數跳轉指令,自然而然就失去粗延時的效果了。

然後我們加上 volatile 之後呢?

用這麼一個源程序(delay_volatile.c):

#include <stdio.h>
void delay(long val);

int main(){
					
	delay(1000000);

	return 0;

}

void delay(volatile long val){

	while(val--);
}

分別選擇編譯器優化(-O2)以及編譯器不優化(默認)進行彙編,對比彙編代碼:

編譯器優化:arm-linux-gcc -O2 -S -o delay_opt2.s delay_volatile.c

編譯器不優化:arm-linux-gcc -S -o delay2.s delay_volatile.c

小結:

1.自定義延時函數中使用 volatile 去聲明 val 變量可以解決編譯器優化帶來的延時失效問題;

2.編譯器優化可以使代碼更加精煉,執行效率更高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章