日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言對于volatile與gcc優化的探究_C 語言

作者:水火汪 ? 更新時間: 2023-04-04 編程語言

volatile是一個特征修飾符(type specifier) volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。這是百度百科的介紹,那編譯器是具體是怎么優化的呢。

我們知道gcc 是有O0 O1 O2 O3的優化等級的,其中O0優化最低,O3優化最高。

現在看下下面一段簡單程序:

#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;
}

不用優化編譯下:

gcc -g ?-O0 main.c

看下反匯編代碼:

objdump -d a.out

看的出來最低等級的優化-O0 的執行程序task_delay函數的匯編指令非常多,性能損耗長。

現在看下O1的優化后效果:

xc@xc-virtual-machine:~$ gcc -g ?-O1 main.c
xc@xc-virtual-machine:~$ objdump -d a.out

反匯編代碼:

明顯task_delay匯編指令比之前-O0優化的時候要少,提升了執行速度。現在在來看下-O3的優化后的反匯編代碼

看的出是直接空指令返回的,且運行地址在1180在main函數是沒調用,這個暫時不知道怎么回事,交給后面的自己了,哈哈。

好了上面都是準備工作,目的是告訴我們-O3能將程序優化極致。現在我們將count入參用volatile修飾,會怎樣,根據百度百科的說法是不會進行優化的,我們測試下:

#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??

發現跟-O0的匯編代碼一樣,沒進行優化。

原文鏈接:https://blog.csdn.net/wanglei_11/article/details/128721324

欄目分類
最近更新