亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

概述

移動

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

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

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

右值

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

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

C++ 值類別表

在 C++11之后,C++根據

  • 被標識:可通過不同標識符指代同一實體。(對象/內存)
  • 可移動:可作為移動語義函數的參數,例如移動構造,移動賦值。

將值分為以下類別:

泛左值:被標識

  • 左值:被標識且不可移動
  • 將亡值:被標識可移動

右值:可移動

  • 將亡值:被標識可移動
  • 純右值:不被標識且可移動

用法舉例

參考測試項目代碼ModernCppTest/modrenc_rvalueref_stdmove.cpp主要內容:

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

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

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

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

		Str(Str&& obj) noexcept {
			LOG("移動構造 obj.str = " << *obj.str);
			this->str = std::move(obj.str);
			// 被移動的對象不應該再被使用了
			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("拷貝構造");
	{
		Str t1("A");
		Str t2 = t1;
		LOG_VAR(*t2.str);
	}


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


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


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

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

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

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

相關文章

  • C++實現LeetCode(167.兩數之和之二 - 輸入數組有序)

    C++實現LeetCode(167.兩數之和之二 - 輸入數組有序)

    這篇文章主要介紹了C++實現LeetCode(167.兩數之和之二 - 輸入數組有序),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C++使用easyX庫實現三星環(huán)繞效果流程詳解

    C++使用easyX庫實現三星環(huán)繞效果流程詳解

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫實現三星環(huán)繞效果,需要的可以參考一下
    2022-10-10
  • C語言的堆串操作詳解

    C語言的堆串操作詳解

    大家好,本篇文章主要講的是C語言的堆串操作詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • OpenCV輪廓檢測之boundingRect繪制矩形邊框

    OpenCV輪廓檢測之boundingRect繪制矩形邊框

    在進行文本檢測時,我們常常會用矩形邊框將檢測到的內容框除。這篇文章主要為大家介紹的是OpenCV中能實現這一效果的函數:boundingRect,感興趣的同學可以學習一下
    2021-12-12
  • 講解C語言編程中指針賦值的入門實例

    講解C語言編程中指針賦值的入門實例

    這篇文章主要介紹了講解C語言編程中指針賦值的入門實例,通過const int i與int *const pi這樣兩個例子來分析指針的賦值和地址指向,需要的朋友可以參考下
    2015-12-12
  • 基于C++ list中erase與remove函數的使用詳解

    基于C++ list中erase與remove函數的使用詳解

    本篇文章是對C++ list中erase與remove函數的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言函數多個返回值方式

    C語言函數多個返回值方式

    這篇文章主要介紹了C語言函數多個返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 將CString字符串輸入轉化成整數的實現方法

    將CString字符串輸入轉化成整數的實現方法

    下面小編就為大家?guī)硪黄獙String字符串輸入轉化成整數的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C語言實現圖書管理系統(tǒng)(文件數據庫)

    C語言實現圖書管理系統(tǒng)(文件數據庫)

    這篇文章主要為大家詳細介紹了C語言實現圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • linux下access函數的用法介紹

    linux下access函數的用法介紹

    access檢查用戶對一個文件的權限情況,根據mode的值檢查調用進程對文件pathname是否具有讀、寫、或執(zhí)行的權限
    2013-08-08

最新評論