C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

  • 一、左值右值
    • 1.左值
    • 2.右值
  • 二、左值引用右值引用
    • 1.左值引用
    • 2.右值引用
    • 總結
  • 三、integral_constant
  • 四、integral_constant的元模板使用案例
    • 1.求最大整數
    • 2.內存對齊
      • alignof關鍵字
      • 元模板計算內存對齊


一、左值右值

1.左值

??含義??:

  • 代表一個有明確、持久內存位置的??對象??。可以理解為能取地址 (&) 的對象。

特點:

  • 有獨立的內存地址(可以對其使用取地址運算符 &)。
  • 在程序的多個地方可以使用(即“有名字”,或者可以通過指針/引用持久訪問)。
  • 通常出現在賦值表達式的 ??左邊或右邊??。
  • 生命周期超出其所在的單個表達式。

例子:

int main() {int x = 10;      // x是左值 (有地址的存儲單元)int arr[5];      // arr是左值int* ptr = &x;   // 對左值取地址有效// 錯誤用法:// &10;          // 錯誤!10是右值(字面量沒有地址)
}

2.右值

含義??:

  • 代表一個??臨時的、即將消亡的值??。通常沒有明確的、可由程序通過變量名或指針直接訪問的內存地址(或者這種訪問沒有意義)。可以理解為“只能出現在賦值表達式??右邊??”的值。

特點:

  • 通常是 ??臨時對象?? 或 ??純常量值??。
  • ??不能??對其使用取地址運算符 &(嘗試這樣做編譯器會報錯)。
  • 通常用于:
    初始化賦值(右邊)
    函數參數(按值傳遞或綁定到右值引用)
    作為函數返回值(按值返回)
    只在該表達式中有效,其值在包含該表達式的語句結束后往往不再需要(將被銷毀)。

例子:

int calculate() { return 100; }int main() {int a = 20;             int b = a + 5;          // (a+5)是右值(臨時計算結果)int c = calculate();    // 函數返回值是右值int d = 30;             // 30本身是右值// 錯誤用法:// &(a+b);              // 錯誤!臨時結果無地址
}

二、左值引用右值引用

1.左值引用

在這里插入圖片描述

2.右值引用

在這里插入圖片描述
在這里插入圖片描述
實際場景對比

// 傳統方式(左值引用)
void process_copy(const std::vector<int>& data) {// 只能讀取,無法優化臨時數據
}// 現代方式(右值引用重載)
void process_move(std::vector<int>&& data) {// 直接接管臨時數據的資源
}int main() {std::vector<int> temp = generateData(); // 生成1GB數據// 傳統處理 - 產生額外拷貝process_copy(temp);        // ? 安全但慢(保留下次使用)// 優化處理 - 避免拷貝process_copy(generateData());   // ? 低效:臨時數據仍被拷貝process_move(generateData());   // ? 高效:直接接管資源// 顯式移交所有權process_move(std::move(temp));  // ?? 移交后temp不再可靠
}

注意:非const左值引用??不能綁定到右值?

總結

左值??:有名字、有地址的對象。
??右值??:臨時對象,沒有名字。
??左值引用(T&)??:只能綁定左值,用于別名。
??右值引用(T&&)??:只綁定右值,用于移動語義。
??std::move??:讓左值變成右值引用。
??std::forward??:在泛型編程中保持值類別。

記住核心目的:右值引用和移動語義是為了避免不必要的拷貝,提升性能。

三、integral_constant

定義常量一般使用:枚舉、static、const 去定義。integral_constant可以讓我們在預編譯期定義常量
基礎使用方式如下:

	typedef std::integral_constant<int, 100>::type TestValue;int a = TestValue::value;

四、integral_constant的元模板使用案例

1.求最大整數

定義:

template<int,int...Args>
struct IntMax;template<int a>
struct IntMax<a> : std::integral_constant<int,a>
{};template<int a1,int a2, int...Args>
struct IntMax<a1, a2, Args...>: std::integral_constant<int, a1 >= a2 ?IntMax<a1, Args...>::value :IntMax<a2, Args...>::value>
{};

使用:

std::cout << IntMax<1, 2, 5, 4, 3>::value << std::endl;

2.內存對齊

alignof關鍵字

用于內存對齊

	struct FStruct{int a;float b;char c;double d;};std::cout << alignof(FStruct) << std::endl; // 結果為8std::cout << sizeof(FStruct) << std::endl; // 結果為24  //int 4 float 4  ||  char 1 -> 8  ||  double 8  ==> 3*8 = 24

元模板計算內存對齊

定義:

template<typename...Args>
struct AlignofStuct : std::integral_constant<int,IntMax<std::alignment_of<Args>::value...>::value>
{};

使用:

	std::cout << AlignofStuct<int, char, float, double>::value << std::endl;

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

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

相關文章

c++算法一

1.雙指針總結&#xff1a;1.復寫0這道題&#xff0c;告訴我們要正難其反&#xff0c;我們從后向前進行重寫&#xff0c;刪除某些數字的時候&#xff0c;我們可以從前向后遍歷&#xff0c;但是增加一些數字的時候會對后面的數據進行覆蓋&#xff0c;所以要從后向前進行2.快樂數涉…

LeetCode-283. 移動零(Java)

283. 移動零 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸入: n…

【數據庫】慢SQL優化 - MYSQL

一、數據庫故障的關鍵點 引起數據庫故障的因素有操作系統層面、存儲層面&#xff0c;還有斷電斷網的基礎環境層面&#xff08;以下稱為外部因素&#xff09;&#xff0c;以及應用程序操作數據庫和人為操作數據庫這兩個層面&#xff08;以下稱內部因素&#xff09;。這些故障中外…

桶排序算法深度剖析

&#x1f50d; 桶排序算法深度剖析 &#x1f3af; 核心原理圖解?? 完整算法流程 #mermaid-svg-LyB6SpaZ132X4Wtn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LyB6SpaZ132X4Wtn .error-icon{fill:#552222;}#mer…

對S32K144做的BMS安裝快速開發Simulink庫及BMS例程介紹

前言 本章介紹BMS硬件功能及SimuLink庫為主&#xff0c;捎帶介紹一些例程內容 注意&#xff1a;例程所用的協議均是自定義的 自做的SimuLink庫也會不定期更新 BMS例程的內容不定期維護添加 當前的BMS沒有主動均衡功能&#xff0c;這個有考慮后期加上&#xff0c;當前還處于…

urlencode、html實體編碼、unicode

目錄 urlencode html實體編碼 Unicode編碼 urlencode URL編碼也稱為百分號編碼&#xff0c;用于將URL中的特殊字符轉換為安全傳輸的格式。英文數字一般不編碼 特點&#xff1a; 使用%后跟兩個十六進制數字表示字符 空格編碼為或%20 保留字符&#xff08;; / ? : & …

【HarmonyOS】元服務概念詳解

【HarmonyOS】元服務概念詳解 最近幾年&#xff0c;我們手里的設備越來越多——手機、平板、手表、車機……光是管理這些設備上的APP就夠頭疼了&#xff1a;下載要流量、安裝占內存、換個設備又得重新弄一遍。有沒有更簡單的方式&#xff1f;HarmonyOS推出的“元服務”&#xf…

vscode/cursor怎么自定義文字、行高、顏色

JetBrains Mono: A free and open source typeface for developers | JetBrains: Developer Tools for Professionals and Teams 首先下載上面的文字&#xff0c;然后右鍵全選&#xff0c;安裝 然后重啟cursor 下載插件Apc Customize UI 點擊設置 把下面的代碼復制進去&…

JavaScript 與 C語言基礎知識差別

一&#xff0c; 變量聲明對比 C語言&#xff1a; int age 20; // 必須指定類型 float price 9.99; char grade A; const double PI 3.14; // 常量JavaScript&#xff1a; let age 20; // 數字 var price 9.99; // 現在不用&#xff0c;有缺點 co…

無縫矩陣支持音頻分離帶畫面分割功能的全面解析

一、技術原理與實現方式1. 音頻分離技術核心功能&#xff1a;HDMI無縫矩陣通過硬件或軟件實現音頻加嵌與分離功能&#xff0c;支持多設備音頻的獨立處理與增強。實現方式&#xff1a;音頻加嵌&#xff1a;將外部音頻信號&#xff08;如麥克風、調音臺&#xff09;嵌入HDMI信號中…

AI創作系列第18篇:海貍IM移動端UI統一大升級 - 從混亂到規范的技術重構之路

AI創作系列第18篇&#xff1a;海貍IM移動端UI統一大升級 - 從混亂到規范的技術重構之路本文是海貍IM AI創作系列的第18篇文章&#xff0c;記錄7月11日-13日周末期間對移動端的UI統一升級工作。這次重構不是功能性的&#xff0c;而是架構性的 - 我們重新設計了整個UI架構&#x…

八、nginx搭建,實現vue跳轉nginx跳轉gateway

基本的調用鏈路: vue調用nginx,nginx反向代理gateway,gateway看用戶是否登錄,沒有登錄的話,就創建驗證碼并先輸入密碼后獲取token。 截止現在我們創建了兩個項目能夠通過feign調用,并且創建好了gateway,且能調用對應的項目。 這一章節,我們搭建好nginx,通過反向代理,…

C++ 中常見的字符串定義方式及其用法

引言 最近在學習C&#xff0c;下面將從基礎到進階的順序&#xff0c;列出一些 C 中常見的字符串定義方式及其用法&#xff0c;包含完整代碼和詳細注釋&#xff0c;加深對代碼的理解。 C 風格字符串&#xff08;char*或 char[]&#xff09; 定義方式 #include <iostream>i…

下一代防火墻-防范DOS攻擊、IPS防護、web防護實驗

一、實驗拓撲二、實驗設備1.山石網科系列下一代防火墻2.三層交換機一臺3.windows兩臺4.各種工具&#xff0c;如hyenae、小旋風服務器、永恒之藍等等三、實驗目的1.掌握網絡攻擊防護策略配置2.通過下一代防火墻來防護服務器免受DOS攻擊四、防范Dos攻擊實驗1.將一臺windows配置為…

【人工智能】通過 Dify 構建智能助手

通過 Dify 構建智能助手1.定義2.如何使用智能助手3.添加助手需要的工具4.配置 Agent5.配置對話開場白6.添加文件上傳7.調試與預覽8.應用發布1.定義 智能助手&#xff08;Agent Assistant&#xff09;&#xff0c;利用大語言模型的推理能力&#xff0c;能夠自主對復雜的人類任務…

破局與重構:文心大模型開源的產業變革密碼

——從技術壟斷到生態共享的戰略轉型深度解析 引言&#xff1a;一場靜悄悄的革命 2024年&#xff0c;當百度宣布文心大模型4.5系列全面開源時&#xff0c;這不僅僅是一次技術發布&#xff0c;更是一場關于AI產業未來走向的戰略博弈。在全球AI競爭白熱化的當下&#xff0c;開源意…

7.15 窗口函數 | 二分 | 位運算

05.071.位運算2.位圖class Solution { public:int exchangeBits(int num) {bitset<33> bitNum(num);for (int i 0; i < 16; i){bitNum[32] bitNum[2*i];bitNum[2*i] bitNum[2*i1];bitNum[2*i1] bitNum[32];}return (int)bitNum.to_ulong();} };577.員工獎金select…

Windows 安裝配置Claude Code

文章目錄1.安裝node.js2.安裝 Claude Code3.測試claude1.安裝node.js https://nodejs.org/en/download/ 一路回車即可順利安裝完成。 再鍵盤按下Win R快捷鍵&#xff0c;輸入cmd&#xff0c;然后回車啟動命令行窗口。分別輸入node -v和npm -v來查看node.js版本和npm版本。 環…

C++動態數組vector

一、為什么要用vector而不是數組 雖有嘉肴&#xff0c;弗食&#xff0c;不知其旨也。______,____,____________。 簡單來說就是節約內存&#xff0c;不容易RE 二、如何使用vector 既謂之數組&#xff0c;則用之如數組 1.定義 vector<數據類型>名稱 vector<int …

14.使用GoogleNet/Inception網絡進行Fashion-Mnist分類

14.1 GoogleNet網絡結構設計import torch from torch import nn from torch.nn import functional as F from torchsummary import summary class Inception(nn.Module):def __init__(self, in_channels,c1,c2,c3,c4,**kwargs):super(Inception,self).__init__(**kwargs)#第一條…