網站首頁 編程語言 正文
1.概念
以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷,內聯函數提升程序運行的效率。
2.函數演示
我們先來看一下普通的函數:
#includeusing namespace std; int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
在匯編代碼我們可以看出函數調用和壓棧:
我們在加inline 試試看:
#includeusing namespace std; inline int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
反匯編:
發現還是一樣,為什么呢?
在debug版本下編譯器不會將內聯函數展開,因為展開就調試不了.
我們需要設置一下屬性:(vs2019)
首先我們打開屬性面板:
接下來進行調試:
?沒有函數的調用!!
反匯編:
3.函數特性
1.inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的函數不適宜使用作為內聯函數。
2.inline對于編譯器而言只是一個建議,編譯器會自動優化,如果定義為inline的函數體內有循環/遞歸等等,編譯器優化時會忽略掉內聯。
3. inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址了,鏈接就會找不到。
4.可以代替宏定義函數.
總結
原文鏈接:https://blog.csdn.net/weixin_62029250/article/details/123503450
相關推薦
- 2022-05-25 <C++>深淺拷貝與初始化列表技巧你真的會了嗎
- 2021-12-09 Wide&Deep Model、Wide Model(LR)、Deep Model、Deep
- 2022-03-15 Docker Run Cadvisor failed: inotify_add_watch /sy
- 2022-06-15 GO語言中err接口及defer延遲異常處理分析_Golang
- 2022-04-14 詳細聊聊C#的并發機制優秀在哪_C#教程
- 2022-02-12 安卓給文件賦777讀寫權限
- 2023-03-16 Android藍牙服務查找附近設備分析探索_Android
- 2022-05-20 Spring-IOC—基于注解配置Bean
- 最近更新
-
- 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同步修改后的遠程分支