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;