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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C語(yǔ)言對(duì)于volatile與gcc優(yōu)化的探究_C 語(yǔ)言

作者:水火汪 ? 更新時(shí)間: 2023-04-04 編程語(yǔ)言

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)化極致。現(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)化。

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

欄目分類(lèi)
最近更新