網站首頁 編程語言 正文
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
相關推薦
- 2022-10-13 C#?Chart控件標記問題詳解_C#教程
- 2023-01-10 阿里云服務器?jdk1.8?安裝配置教程_服務器其它
- 2022-07-13 RedisTemplate無法根據key 獲取值的問題
- 2022-04-02 python3?QT5?端口轉發工具兩種場景分析_python
- 2022-08-20 Python超詳細講解元類的使用_python
- 2022-03-18 .NET?6開發TodoList應用之實現PUT請求_實用技巧
- 2022-11-07 go?分布式鎖簡單實現實例詳解_Golang
- 2022-09-22 原型鏈及原型鏈的作用/構造函數,原型對象,實例對象的三角關系
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支