最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++基本用法實踐之移動語義詳解

 更新時間:2023年07月17日 11:41:52   作者:寡人正在Coding  
移動(move)語義是C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝,下面小編就來和大家簡單聊聊C++中移動語義的相關(guān)使用吧,希望對大家有所幫助

概述

移動

移動(move)語義C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝。在構(gòu)造或者賦值的時候,如果實參是右值(或者左值由std::move轉(zhuǎn)換成右值),便會匹配移動語義的函數(shù)調(diào)用如下述舉例的Str(Str&& obj)。

移動語義的本質(zhì)是將資源(內(nèi)存/句柄)轉(zhuǎn)移給另一個對象,被轉(zhuǎn)移資源的對象不應(yīng)再被使用。(這個概念有點像仙俠小說中的奪舍,奪舍成功的人獲取被奪舍的人的身體(資源)),如下面?zhèn)未a:

class Obj
{
	data
	Obj(){
		data = malloc(100)
	}
	// 移動 (奪舍)
	Obj(Obj&& other){
		data = other.data
		other.data = nullptr
	}
}

右值

右值直觀理解是等號右邊的值(大概如此,并不準(zhǔn)確),右值的概念指代的東西比較多,大概是指不可尋址的值(也有例外)。我覺得這個不必太過糾結(jié),記住幾個常見的即可:

  • 臨時對象:如函數(shù)返回的臨時對象(下面有舉例)
  • 字面量
  • 顯式std::move()轉(zhuǎn)換的值
  • 沒有捕獲參數(shù)的lambda

C++ 值類別表

在 C++11之后,C++根據(jù)

  • 被標(biāo)識:可通過不同標(biāo)識符指代同一實體。(對象/內(nèi)存)
  • 可移動:可作為移動語義函數(shù)的參數(shù),例如移動構(gòu)造,移動賦值。

將值分為以下類別:

泛左值:被標(biāo)識

  • 左值:被標(biāo)識且不可移動
  • 將亡值:被標(biāo)識可移動

右值:可移動

  • 將亡值:被標(biāo)識可移動
  • 純右值:不被標(biāo)識且可移動

用法舉例

參考測試項目代碼ModernCppTest/modrenc_rvalueref_stdmove.cpp主要內(nèi)容:

  • 移動語義下的構(gòu)造和賦值
  • 移動還是拷貝的重載匹配
  • C++ 優(yōu)化臨時對象(連加產(chǎn)生的中間臨時對象)嘗試調(diào)用移動語義
#include "ModernCppTestHeader.h"
#include <string>
using std::string;

namespace n_rvalueref {
	class Str {
	public:
		Str() {
			LOG("無參構(gòu)造");
			this->str = new string();
		}

		Str(const string& str) {
			LOG("有參構(gòu)造 str = " << str);
			this->str = new string(str);
		}

		Str(const Str& obj) {
			LOG("拷貝構(gòu)造 obj.str = " << *obj.str);
			this->str = new string(*obj.str);
		}

		Str(Str&& obj) noexcept {
			LOG("移動構(gòu)造 obj.str = " << *obj.str);
			this->str = std::move(obj.str);
			// 被移動的對象不應(yīng)該再被使用了
			obj.str = nullptr;
		}

		Str& operator=(Str&& v) noexcept {
			LOG("移動語義 operator = ");

			if (this != &v) {
				this->str = std::move(v.str);
			}

			return *this;
		}

		Str operator+(const Str& v)
		{
			string s = *this->str + *v.str;
			return Str(s);
		}

		void Log()
		{
			LOG(str);
		}

		string* str;
	};
}

using n_rvalueref::Str;

// 右值引用&移動語義
void rvalueref_stdmove_test()
{
	LOG_FUNC();

	LOG_TAG("拷貝構(gòu)造");
	{
		Str t1("A");
		Str t2 = t1;
		LOG_VAR(*t2.str);
	}


	LOG_TAG("移動構(gòu)造, 注意被移動的對象t1不應(yīng)再被使用");
	{
		// t1是左值,使用std::move強(qiáng)制轉(zhuǎn)換成右值
		Str t1("A");
		Str t2 = std::move(t1);
		LOG_VAR(*t2.str);
	}


	LOG_TAG("移動語義的運(yùn)算符重載,注意運(yùn)算符重載發(fā)生賦值運(yùn)算(這個例子),而不是構(gòu)造運(yùn)算(上個例子)");
	{
		Str t1("A");
		Str t2;
		t2 = std::move(t1);
	}


	LOG_TAG("除了上述顯示使用std::move轉(zhuǎn)換,常見的容易忽視的發(fā)生移動構(gòu)造場合列舉");
	{
		LOG("---1 連續(xù)加法產(chǎn)生的臨時對象,c++會嘗試使用移動語義進(jìn)行優(yōu)化");
		Str t1("A");
		Str t2("B");
		Str t3("C");
		Str t4;
		t4 = t1 + t2 + t3;

		LOG("---2 函數(shù)返回的臨時對象,c++會嘗試使用移動語義進(jìn)行優(yōu)化");
		auto f = []() {
			auto s = Str("Hi"); 
			return s; 
		};
		Str t5 = f();

		/*
		- 在容器中插入或刪除元素:比如 std::vector::push_back,如果傳遞給它的是右值,它就會使用移動語義。
		- 在標(biāo)準(zhǔn)庫算法中:許多標(biāo)準(zhǔn)庫算法,比如 std::sort,std::partition 等,在進(jìn)行元素交換時會使用移動語義。
		- 在 std::swap 中:std::swap 會使用移動語義來交換兩個對象。
		*/
	}
}

到此這篇關(guān)于C++基本用法實踐之移動語義詳解的文章就介紹到這了,更多相關(guān)C++移動語義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中map和set的使用示例詳解

    C++中map和set的使用示例詳解

    set的底層是用紅黑樹實現(xiàn)的,增刪查的效率是O(logn),迭代器遍歷走的是搜索樹的中序遍歷,所以遍歷后的元素是有序的,本文給大家介紹了C++中map和set的使用示例,感興趣的朋友一起看看吧
    2025-05-05
  • C語言?模擬實現(xiàn)memcpy與memmove函數(shù)詳解

    C語言?模擬實現(xiàn)memcpy與memmove函數(shù)詳解

    這篇文章主要介紹了C語言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-04-04
  • C++實現(xiàn)LeetCode(144.二叉樹的先序遍歷)

    C++實現(xiàn)LeetCode(144.二叉樹的先序遍歷)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(144.二叉樹的先序遍歷),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++標(biāo)準(zhǔn)庫(std)用法解讀

    C++標(biāo)準(zhǔn)庫(std)用法解讀

    本文介紹了C++標(biāo)準(zhǔn)庫的主要組成部分及其使用方法,涵蓋命名空間、輸入輸出流、字符串處理、STL容器、算法、數(shù)值處理、函數(shù)對象與可調(diào)用對象、異常處理、時間日期、文件系統(tǒng)、線程支持和正則表達(dá)式等,示例代碼展示了如何使用這些功能
    2026-04-04
  • c++中用TINYXML解析XML文件

    c++中用TINYXML解析XML文件

    這篇文章主要介紹了c++中如何用TINYXML解析XML文件,文中案例非常詳細(xì),幫助大家更好的了解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C/C++?-?從代碼到可執(zhí)行程序的過程詳解

    C/C++?-?從代碼到可執(zhí)行程序的過程詳解

    這篇文章主要介紹了C/C++?-?從代碼到可執(zhí)行程序的過程,主要有預(yù)編譯和編譯,匯編鏈接,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • c語言中使用BF-KMP算法實例

    c語言中使用BF-KMP算法實例

    這篇文章主要介紹了c語言中使用BF-KMP算法,大家參考使用
    2013-11-11
  • c++的glog與spdlog的性能對比測試分析

    c++的glog與spdlog的性能對比測試分析

    這篇文章主要為大家介紹了c++的glog與spdlog的性能對比測試分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 解析C++中虛析構(gòu)函數(shù)的作用

    解析C++中虛析構(gòu)函數(shù)的作用

    本篇文章是對C++中虛析構(gòu)函數(shù)的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中String類的常用接口函數(shù)總結(jié)

    C++中String類的常用接口函數(shù)總結(jié)

    這篇文章主要介紹了C++中Stirng類的常用接口函數(shù),文中有詳細(xì)的代碼示例供大家參考,對我們學(xué)習(xí)C++有一定的幫助,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-06-06

最新評論

石首市| 晋江市| 金川县| 会理县| 四平市| 宁国市| 漳浦县| 藁城市| 定远县| 乳山市| 城口县| 峡江县| 吴川市| 四会市| 冷水江市| 普兰县| 大同县| 朝阳市| 土默特左旗| 桦南县| 陵水| 张家口市| 石家庄市| 工布江达县| 策勒县| 南江县| 民县| 同江市| 郁南县| 扎鲁特旗| 瑞昌市| 达尔| 上思县| 泗阳县| 西畴县| 扶绥县| 古交市| 武夷山市| 托克逊县| 尉氏县| 黄龙县|