c++-函數增強

一、編譯器對函數名的處理

1. C與C++的差異
  • C編譯器:保留原始函數名,無額外處理。例如:

    int add(int a, int b) { return a + b; }

    在匯編代碼中仍為add

  • C++編譯器:通過name mangling(名稱修飾)生成唯一函數標識,格式為_Z[函數名長度][函數名][參數類型縮寫]。例如:

    int add(int, int) → _Z3addii
    float add(float, float) → _Z3addff

    作用:支持函數重載,確保鏈接時能區分同名不同參的函數。

2. 擴展:編譯器實現差異
  • GCC/Clang:遵循Itanium C++ ABI規范,使用上述修飾規則。

  • MSVC:采用不同修飾規則,例如:

    int add(int, int) → ?add@@YAHHH@Z
  • 查看修飾名:可通過nm命令或objdump工具查看目標文件中的符號表。


二、函數重載

1. 核心規則
  • 定義:同一作用域內,函數名相同但參數列表不同(參數類型、數量或順序不同)。

  • 返回值類型不同不構成重載條件:

    int add(int a, int b); // 合法
    double add(int a, int b); // 編譯錯誤
2. 本質與實現
  • 通過name mangling生成唯一符號,鏈接時正確綁定調用目標。

  • 限制:C語言不支持函數重載,因無name mangling機制。

3. 擴展:重載解析優先級

編譯器按以下順序匹配最佳函數:

  1. 精確匹配:參數類型完全一致。

  2. 類型提升:如charint

  3. 標準轉換:如intdouble

  4. 用戶定義轉換:如類構造函數或轉換運算符。


三、默認參數

1. 規則詳解
  • 聲明位置:默認參數只能在函數聲明中指定,定義中不可重復:

    int add(int a, int b, int c = 100); // 聲明
    int add(int a, int b, int c) { return a + b + c; } // 定義

    錯誤示例:

    int add(int a, int b, int c = 100) { ... } // 編譯錯誤
  • 參數順序:默認參數必須從右向左連續設置:

    void func(int a, int b = 10, int c = 20); // 正確
    void func(int a = 5, int b, int c); // 錯誤:c未設置默認值
2. 擴展:默認參數與函數重載的交互
  • 默認參數可能導致函數重載的二義性:

    void print(int a, int b = 0);
    void print(int a);
    print(10); // 錯誤:編譯器無法確定調用哪個版本

四、內聯函數

1. 核心機制
  • 作用:消除函數調用開銷,將函數體直接插入調用位置。

  • 使用方式

    • 關鍵字inline:向編譯器建議內聯(非強制)。

    • GCC擴展屬性:__attribute__((always_inline))強制內聯(仍需編譯器支持):

      inline __attribute__((always_inline)) int add(int a, int b) {return a + b;
      }
2. 適用場景與限制
  • 適用:短小、頻繁調用的函數(如簡單數學運算)。

  • 不適用:遞歸函數、包含循環或復雜邏輯的大函數。

  • 注意事項

    • 過度內聯可能導致代碼膨脹,影響緩存局部性。

    • 編譯器可能忽略內聯建議(如優化級別為-O0時)。

3. 擴展:內聯函數 vs 宏函數
特性內聯函數宏函數(#define
類型安全是(編譯器檢查類型)否(文本替換,可能出錯)
調試支持支持(有符號信息)不支持(預處理器階段替換)
作用域遵守作用域規則全局替換,可能污染命名空間
參數求值參數僅求值一次可能多次求值(如MAX(a++, b)

五、高級擴展:C++11后的相關特性

1.?constexpr函數
  • 隱式內聯:C++11起,constexpr函數默認具有內聯屬性,支持編譯期計算:

    constexpr int add(int a, int b) {return a + b;
    }
2. 內聯變量(C++17)
  • 允許在頭文件中定義內聯變量,避免多重定義錯誤:

    inline int global = 42; // 允許多次包含該頭文件

總結

  1. 函數重載依賴C++的name mangling機制,通過參數列表區分同名函數。

  2. 默認參數需嚴格遵循聲明順序規則,避免二義性調用。

  3. 內聯函數是性能優化手段,需權衡代碼體積與執行效率,優先替代宏函數以提高安全性。

  4. 現代C++特性(如constexpr)進一步擴展了內聯的應用場景,支持編譯期計算。

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

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

相關文章

跟著StatQuest學知識08-RNN與LSTM

一、RNN (一)簡介 整個過程權重和偏置共享。 (二)梯度爆炸問題 在這個例子中w2大于1,會出現梯度爆炸問題。 當我們循環的次數越來越多的時候,這個巨大的數字會進入某些梯度,步長就會大幅增加&…

HarmonyOS 之 @Require 裝飾器自學指南

在 HarmonyOS 應用開發工作中,我頻繁碰到組件初始化傳參校驗的難題。在復雜的組件嵌套里,要是無法確保必要參數在構造時準確傳入,就極易引發運行時錯誤,而且排查起來費時費力。一次偶然的機會,我接觸到了 Require 裝飾…

CDN節點對網絡安全掃描的影響:挑戰與應對策略

引言 在當今互聯網環境中,內容分發網絡(CDN)已成為提升網站性能和用戶體驗的關鍵技術。然而,CDN的廣泛應用也為網絡安全掃描帶來了新的挑戰。本文將深入探討CDN節點如何影響各類安全掃描工作,分析由此產生的安全風險,并提供有效的…

【Git多分支使用教程】

Git多分支使用教程 Git多分支使用手冊目錄多分支只拉取一個多分支拉取指定幾個步驟 1:克隆第一個分支步驟 2:獲取其他分支 常見問題與解決方法1. 錯誤:origin/分支名 is not a commit2. 分支名稱沖突3. --single-branch 限制 總結 Git多分支使…

【身份安全】OAuth 2.0工作原理(一)

目錄 OAuth 授權框架一、OAuth 角色二、協議流程三、應用注冊(Application Registration)用戶 ID(Client ID) 和 用戶密碼(Client Secret) 四、權限授予1、授權碼鏈接2、用戶授權申請3、應用程序接收授權碼…

大疆上云api直播功能如何實現

概述 流媒體服務器作為直播畫面的中轉站,它接收推流端的相機畫面,同時拉流端找它獲取相機的畫面。整個流程如下: 在流媒體服務器上創建流媒體應用(app),一個流媒體服務器上面可以創建多個流媒體應用約定推拉流的地址。假設流媒體服務器工作在1935端口上面,假設創建的流…

ESP-01模塊連接手機熱點問題及解決方法

在使用ESP-01模塊連接手機熱點時,可能會遇到一些問題。本文將詳細介紹如何解決這些問題,并分享最終通過將WiFi切換到2.4GHz成功解決問題的經驗。 一、問題描述 在嘗試使用ESP-01模塊連接手機熱點時,遇到了連接失敗的問題。以下是操作過程中…

NG-ZORRO中tree組件的getCheckedNodeList怎么使用

在 NG-ZORRO(Ant Design for Angular) 的 Tree 組件 中,getCheckedNodeList 方法用于獲取當前選中的節點列表(包括半選狀態節點)。以下是具體用法和示例: 基本用法 首先,確保你已通過 ViewChil…

業務流程先導及流程圖回顧

一、測試流程回顧  1. 備測內容回顧  備測內容: 本次測試涵蓋買家和賣家的多個業務流程,包括下單流程、發貨流程、搜索退貨退款、支付搶購、換貨流程、個人中心優惠券等。 2. 先測業務強調  1)測試業務流程 …

從ChatGPT到AutoGPT——AI Agent的范式遷移

一、AI Agent的范式遷移 1. ChatGPT的局限性與Agent化需求 單輪對話的“工具屬性” vs. 多輪復雜任務的“自主性” ChatGPT 作為強大的生成式AI,雖然能夠進行連貫對話,但本質上仍然是“工具型”AI,依賴用戶提供明確的指令,而無法自主規劃和執行任務。 人類介入成本過高:提…

【Kafka】分布式消息隊列的核心奧秘

文章目錄 一、Kafka 的基石概念?主題(Topic)?分區(Partition)?生產者(Producer)?消費者(Consumer)? 二、Kafka 的架構探秘?Broker 集群?副本機制? 三、Kafka 的卓越特性?高…

【藍橋杯14天沖刺課題單】Day 1

1. 題目鏈接:19937 藝術與籃球 該題目的難點主要在20240413這個日期需要結束程序跳出循環。最開始將該輸出ans的位置放在了for循環之外,此時的日期已經循環完了2024年所有的日期,則最后會統計多而導致結果錯誤。 AC代碼: #incl…

AI人工智能-Jupyter NotbookPycharm:Py開發

安裝 命令: pip install jupyter 啟動 命令: jupyter notebook 啟動成功后,下面網址會默認自動打開當前用戶的根目錄。 其實這個頁面顯示的內容,是我們電腦目錄C:\Users\當前用戶\下的文件夾 我們平常做實驗,希望在…

命懸生死線:當游戲遭遇DDoS圍剿,如何用AI破局?

文章作者:騰訊宙斯盾DDoS防護團隊 一、血色戰場:DDoS攻擊游戲產業的致命瞬間 全球黑色星期五 這是一場波及全球的“黑色星期五”,起初無人察覺,包括小林。 他剛下班到家就迫不及待打開電腦,準備體驗期待已久的《黑神話…

使用HTML5和CSS3實現3D旋轉相冊效果

使用HTML5和CSS3實現3D旋轉相冊效果 這里寫目錄標題 使用HTML5和CSS3實現3D旋轉相冊效果項目介紹技術棧核心功能實現思路1. HTML結構2. CSS樣式解析2.1 基礎樣式設置2.2 3D效果核心樣式2.3 卡片樣式 3. JavaScript交互實現3.1 旋轉控制3.2 自動播放功能 技術要點總結項目亮點總…

【HTML 基礎教程】HTML <head>

HTML <head> 查看在線實例 <title> - 定義了HTML文檔的標題 使用 <title> 標簽定義HTML文檔的標題 <base> - 定義了所有鏈接的URL 使用 <base> 定義頁面中所有鏈接默認的鏈接目標地址。 <meta> - 提供了HTML文檔的meta標記 使用 <me…

macbook電腦如何清理鍵盤防止誤觸

M1芯片的MacBook電腦關機后按任意鍵開機&#xff0c;是蘋果的功能設計。這樣設計的目的是為了方便用戶&#xff0c;讓用戶在想要使用電腦時能快速開機。但是清理電腦鍵盤的時候卻成為了一種苦惱 以下是一些清理 MacBook 鍵盤防止誤觸的方法&#xff1a; 使用工具鎖定鍵盤 Cle…

Rust 面向對象

Rust 面向對象 引言 Rust 是一種系統編程語言,以其高性能、內存安全和并發支持而受到關注。Rust 的面向對象特性是其強大功能之一,它允許開發者以面向對象的方式構建復雜的應用程序。本文將深入探討 Rust 的面向對象編程(OOP)特性,包括類的定義、繼承、封裝和多態等概念…

Redis 源碼硬核解析系列專題 - 第二篇:核心數據結構之SDS(Simple Dynamic String)

1. 引言 Redis沒有直接使用C語言的標準字符串(以\0結尾的字符數組),而是自定義了SDS(Simple Dynamic String)。SDS是Redis的基礎數據結構之一,廣泛用于鍵值存儲、命令參數等場景。本篇將深入剖析SDS的實現原理、優勢以及源碼細節。 2. 為什么不用C標準字符串? C字符串…

python-59-基于python內置庫解析html獲取標簽關鍵信息

文章目錄 1 html.parser1.1 初始化和基礎使用1.1.1 handle_starttag(self, tag, attrs)1.1.2 handle_endtag(self, tag)1.1.3 handle_startendtag(self, tag, attrs)1.1.4 handle_data(self, data)1.1.5 handle_comment(self, data)1.2 解析HTML文檔的流程2 百度搜索關鍵詞鏈接…