【C++】內聯函數、auto、范圍for

文章目錄

  • 1.內聯函數
  • 2.auto關鍵字
    • 2.1auto簡介
    • 2.2auto的注意事項
    • 2.3auto不能推導的場景
  • 3.基于范圍的for循環(C++11)
  • 4.指針空值nullptr(C++11)

在這里插入圖片描述

1.內聯函數

  1. 概念:

以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數調用建立棧幀的開銷,內聯函數提升程序運行的效率。

下面的代碼就是不使用內聯函數,會建立棧幀。
在這里插入圖片描述

如果在上述函數前增加inline關鍵字將其改成內聯函數,在編譯期間編譯器會用函數體替換函數的調用。
注意:Debug下,默認是不展開的,因為展開以后不方便調試。需要設置編譯器。

在這里插入圖片描述
此時,匯編代碼中是沒有call指令的,函數展開了。

  1. 特性
  • inline是一種以空間換時間的做法,如果編譯器將函數當成內聯函數處理,在編譯階段,會用函數體替換函數調用缺陷:可能會使目標文件變大,優勢:少了調用開銷,提高程序運行效率
  • inline對于編譯器而言只是一個建議,不同編譯器關于inline實現機制可能不同,一般建議:將函數規模較小(即函數不是很長,具體沒有準確的說法,取決于編譯器內部實現)、不是遞歸、且頻繁調用的函數采用inline修飾,否則編譯器會忽略inline特性
    • 如果函數的規模較大(不建議展開),展開以后,編譯出來的可執行程序就會變大。
  • inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址了,鏈接就會找不到。(可以理解為:內聯函數沒有地址,它已經被展開了)

在這里插入圖片描述

【面試題】 宏的優缺點?
優點:

  • 增強代碼的復用性。
  • 提高性能。

缺點:

  • 不方便調試宏。(因為預編譯階段進行了替換)
  • 導致代碼可讀性差,可維護性差,容易誤用。
  • 沒有類型安全的檢查 。

C++有哪些技術替代宏?

  1. 常量定義 換用const、enum
  2. 短小函數定義 換用內聯函數

2.auto關鍵字

2.1auto簡介

隨著程序越來越復雜,程序中用到的類型也越來越復雜,經常體現在:

  1. 類型難于拼寫
  2. 含義不明確導致容易出錯

有的同學也許也會想到,可以使用typedef 給較長的類型取別名,但是這種方法是有缺陷的,例如:
在這里插入圖片描述

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,大家可思考下為什么?

早期的auto關鍵字雖然是用來聲明具有自動存儲器的局部變量,但是我不寫auto它也是局部的,何必自找麻煩。

C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得

在這里插入圖片描述

typeid是一個關鍵字,用來獲取一個表達式的類型信息。

注意:

使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型

在這里插入圖片描述

2.2auto的注意事項

  1. auto與指針和引用結合起來使用

用auto聲明指針類型時,用auto和auto * 沒有任何區別,但用auto聲明引用類型時則必須加&

在這里插入圖片描述

  1. 在同一行定義多個變量

當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量
在這里插入圖片描述

2.3auto不能推導的場景

  1. auto不能作為函數的參數

若auto作為參數,那形參是什么類型呢?編譯器是不知道的,編譯時就不知道棧幀要開多大
在這里插入圖片描述

  1. auto不能直接用來聲明數組

在這里插入圖片描述

  1. 為了避免與C++98中的auto發生混淆(C++11中被廢棄了),C++11只保留了auto作為類型指示符的用法
  2. auto在實際中最常見的優勢用法就是跟C++11提供的新式for循環,還有lambda表達式等進行配合使用。

3.基于范圍的for循環(C++11)

  1. 范圍for簡介

在C++98中如果要遍歷一個數組,可以按照以下方式進行:
在這里插入圖片描述

對于一個有范圍的集合而言,由程序員來說明循環的范圍是多余的,有時候還會容易犯錯誤。因此C++11中引入了基于范圍的for循環。for循環后的括號由冒號“ :”分為兩部分:第一部分是范圍內用于迭代的變量,第二部分則表示被迭代的范圍

在這里插入圖片描述

要想改變數組中的元素,需要使用引用

在這里插入圖片描述

注意:與普通循環類似,可以用continue來結束本次循環,也可以用break來跳出整個循環。

  1. 范圍for的使用條件
  • for循環迭代的范圍必須是確定的

對于數組而言,就是數組中第一個元素和最后一個元素的范圍;對于類而言,應該提供begin和end的方法,begin和end就是for循環迭代的范圍。
注意:以下代碼就有問題,因為for的范圍不確定

void TestFor(int array[]){for(auto& e : array)//errorcout<< e <<endl;}

4.指針空值nullptr(C++11)

如果一個指針沒有合法的指向,我們基本都是按照如下方式對其進行初始化

void TestPtr()
{int* p1 = NULL;int* p2 = 0;// ……
}

NULL實際是一個宏,在傳統的C頭文件(stddef.h)中,可以看到如下代碼:

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void)的常量*。不論采取何種定義,在使用空值的指針時,都不可避免的會遇到一些麻煩,比如:
在這里插入圖片描述
程序本意是想通過f(NULL)調用指針版本的f(int*)函數,但是由于NULL被定義成0,因此與程序的初衷相悖。

在C++98中,字面常量0既可以是一個整形數字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void*)0。
在這里插入圖片描述

  1. 在使用nullptr表示指針空值時,不需要包含頭文件,因為nullptr是C++11作為新關鍵字引入的

  2. 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節數相同。

  3. 為了提高代碼的健壯性,在后續表示指針空值時建議最好使用nullptr。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12247.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

商場綜合體能源監管平臺,實現能源高效管理

商場作為大型綜合體建筑&#xff0c;其能源消耗一直是備受關注的問題。為了有效管理商場能耗&#xff0c;提高商場能源效率&#xff0c;商場綜合體能源監管平臺應運而生。 商場綜合體能源監管平臺可通過軟硬件一起進行節能監管&#xff0c;硬件設備包括各種傳感器、監測儀表和…

Matter 1.3版標準新出爐,支持更多智能家居/家電/能源等設備

5月8日&#xff0c;CSA連接標準聯盟正式發布了Matter 1.3標準&#xff0c;過去CSA一直保持約每六個月一次的標準更新節奏。 圖源CSA連接標準聯盟官方 獲得一系列改進的Matter 1.3標準&#xff0c;將提升設備的互操作性&#xff0c;擴展支持的設備類別&#xff0c;并增強整個智…

Android 幾種系統升級方式詳解

目錄 ◆ 概述 ● 幾種啟動模式 ● MISC分區 ● CACHE分區 ● 幾種系統升級方式 ◆ Recovery升級 ● 升級包構成&#xff0c;簽名&#xff0c;制作 ● 升級腳本 ● 升級過程 ◆ OTA升級 ● 升級包構成&#xff0c;制作 ● 升級腳本 ● 升級過程 ◆ fastboot升級 ◆ ADB升級 幾…

【研發日記】Matlab/Simulink技能解鎖(七)——兩種復數移相算法

復數移相&#xff0c;也稱為復數相位旋轉&#xff0c;就是在原有復數的基礎上&#xff0c;不改變模數&#xff0c;只把相位角做一定的偏移。 文章目錄 前言 三角函數移相 復數乘法移相 分析和應用 總結 前言 見《【研發日記】Matlab/Simulink技能解鎖(二)——在Function編…

(三)Spring教程——依賴注入與控制反轉

Spring框架是為了簡化企業級應用開發而創建的&#xff0c;其強大之處在于對Java SE和Java EE開發進行全方位的簡化&#xff0c;Spring還對常用的功能進行封裝&#xff0c;可以極大地提高Java EE的開發效率。 依賴注入是Spring的核心技術之一&#xff0c;也被稱為“控制反轉”&a…

【Linux】自動化編譯工具——make/makefile(超細圖例詳解!!)

目錄 一、前言 二、make / Makefile背景介紹 &#x1f95d;Makefile是干什么的&#xff1f; &#x1f347;make又是什么&#xff1f; 三、demo實現【見見豬跑&#x1f416;】 四、依賴關系與依賴方法 1、概念理清 2、感性理解【父與子&#x1f468;】 3、深層理解【程序…

【JavaEE】HTTP 協議

文章目錄 一、HTTP 協議1、HTTP 是什么2、理解 "應用層協議"3、理解 HTTP 協議的工作過程4、HTTP 協議格式5、HTTP 請求 (Request)5.1 認識 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作過程3.1 對稱加密3.2 非對稱加密3.3 證書3.4 完…

零樣本身份保持:ID-Animator引領個性化視頻生成技術新前沿

在最新的研究進展中&#xff0c;由Xuanhua He及其團隊提出的ID-Animator技術&#xff0c;為個性化視頻生成領域帶來了突破性的創新。這項技術的核心在于其零樣本&#xff08;zero-shot&#xff09;人物視頻生成方法&#xff0c;它允許研究者和開發者根據單一的參考面部圖像生成…

深度解刨性能測試工具Locust

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 關注公眾號【互聯網雜貨鋪】&#xff0c;回復 1 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Locust安裝 …

Python3 筆記:range() 函數

range() 函數返回數字序列&#xff0c;默認從 0 開始&#xff0c;默認以 1 遞增&#xff0c;并以指定的數字結束。 它的語法格式&#xff1a;range(start,end,step) start是起始值&#xff0c;end是終止值&#xff0c;step是間隔值 上述語句可以產生一個[start,…, end-1]列…

gin框架學習筆記(三) ——路由請求與相關參數

參數種類與參數處理 查詢參數 在講解查詢參數的定義之前&#xff0c;我們先來看一個例子&#xff0c;當我打開了CSDN&#xff0c;我現在想查看我的博客瀏覽量&#xff0c;那么我就需要點擊我的頭像來打開我的個人主頁,像下面這樣: 我們現在把瀏覽器的網址取下來&#xff0c;…

【35分鐘掌握金融風控策略27】貸中風控策略與客戶運營體系

目錄 貸中風控策略與客戶運營體系 貸中風控日標 貸中風控數據源 貸中風控策略與客戶運營體系 貸中是風控的第二道防線&#xff0c;貸中階段風控的重點工作就是存量客戶風控及運營。在當下&#xff0c;新客市場趨于飽和且獲客成本越來越高&#xff0c;所以&#xff0c;在做好…

基于Java的俄羅斯方塊游戲的設計與實現

關于俄羅斯方塊項目源碼.zip資源-CSDN文庫https://download.csdn.net/download/JW_559/89300281 基于Java的俄羅斯方塊游戲的設計與實現 摘 要 俄羅斯方塊是一款風靡全球&#xff0c;從一開始到現在都一直經久不衰的電腦、手機、掌上游戲機產品&#xff0c;是一款游戲規則簡單…

物聯網設計競賽_1_邊緣人工智能云計算

邊緣人工智能&#xff1a; 本質上邊緣人工智能&#xff0c;直接會在邊緣設備上運行機器學習算法&#xff0c;例如物聯網設備或邊緣服務器上&#xff0c;這樣可以減少數據傳輸延遲&#xff0c;提高響應速度。 云計算&#xff1a; 云計算模型中&#xff0c;數據通常被發送到遠…

在React中利用Postman測試代碼獲取數據

文章目錄 概要名詞解釋1、Postman2、axios 使用Postman測試API在React中獲取并展示數據小結 概要 在Web開發中&#xff0c;通過API獲取數據是一項常見任務。Postman是一個功能強大的工具&#xff0c;可以幫助開發者測試API&#xff0c;并查看API的響應數據。在本篇博客中&…

【C語言】—— 動態內存管理

【C語言】——動態內存管理 一、動態內存管理概述1.1、動態內存的概念1.2、動態內存的必要性 二、 m a l l o c malloc malloc 函數2.1、函數介紹2.2、應用舉例 三、 c a l l o c calloc calloc 函數四、 f r e e free free 函數4.1、函數介紹4.2、應用舉例 五、 r e a l l o …

無列名注入

在進行sql注入時&#xff0c;一般都是使用 information_schema 庫來獲取表名與列名&#xff0c;因此有一種場景是傳入參數時會將 information_schema 過濾 在這種情況下&#xff0c;由于 information_schema 無法使用&#xff0c;我們無法獲取表名與列名。 表名獲取方式 Inn…

Redis——Redis集群腦裂問題

Redis集群的腦裂問題&#xff08;Split-Brain&#xff09;是一個在分布式系統中可能發生的嚴重問題&#xff0c;特別是在基于主從復制和哨兵&#xff08;Sentinel&#xff09;機制的Redis集群環境中。以下是對Redis集群腦裂問題的詳細闡述&#xff1a; 定義 Redis集群腦裂問題…

FullCalendar日歷組件集成實戰(3)

背景 有一些應用系統或應用功能&#xff0c;如日程管理、任務管理需要使用到日歷組件。雖然Element Plus也提供了日歷組件&#xff0c;但功能比較簡單&#xff0c;用來做數據展現勉強可用。但如果需要進行復雜的數據展示&#xff0c;以及互動操作如通過點擊添加事件&#xff0…

SwiftUI中的常用圖形(Shapes)

概述 在SwiftUI中&#xff0c;常用的圖形&#xff08;Shape&#xff09;主要有&#xff1a; Circle&#xff1a;圓形 Ellipse&#xff1a;橢圓形 Capsule&#xff1a;膠囊形 Rectangle&#xff1a;矩形 RoundedRectangle&#xff1a;圓角矩形 上面的這些圖形都繼承了Shape協議…