From f8e28d70faf13c93413308c75478852fc34750d2 Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Thu, 9 Jun 2022 14:00:26 +0800 Subject: [PATCH] vault backup: 2022-06-09 14:00:26 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affected files: 02. PARA/03. Resources(資源)/C++17/rvalue.md --- .../03. Resources(資源)/C++17/rvalue.md | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/02. PARA/03. Resources(資源)/C++17/rvalue.md b/02. PARA/03. Resources(資源)/C++17/rvalue.md index 0ffb5d0..7088a41 100644 --- a/02. PARA/03. Resources(資源)/C++17/rvalue.md +++ b/02. PARA/03. Resources(資源)/C++17/rvalue.md @@ -35,8 +35,53 @@ int& c = r; 了解rvalue reference之後,就可以實作類別的 move constructor 跟move assignment operator。 -## Move constructor -Mov +## Move assignment operator +假設我們有一個class叫BigBuffer,定義如下: +```cpp +class BigBuffer { +public: + BigBuffer(int size=100*1024*1024) : + bufferSize(size) + { + std::cout << "BigBuffer constructor\n"; + this->buffer = std::make_unique(bufferSize); + } + + ~BigBuffer() { + std::cout << "BigBuffer destructor\n"; + } + + BigBuffer(const BigBuffer& src) { + std::cout << "BigBuffer copy constructor\n"; + bufferSize = src.bufferSize; + buffer = std::make_unique(bufferSize); + std::memcpy(buffer.get(), src.buffer.get(), bufferSize); + } + + BigBuffer& operator= (BigBuffer& src) { + std::cout << "BigBuffer copy operator\n"; + bufferSize = src.bufferSize; + buffer = std::make_unique(bufferSize); + std::memcpy(buffer.get(), src.buffer.get(), bufferSize); + return *this; + } + +private: + int bufferSize = 0; + std::unique_ptr buffer = nullptr; +}; +``` + +這個class的特色就是每一次使用都會佔用100MB的記憶體空間,想像下面的程式的動作: +```cpp +BigBuffer buf1; +// Do something with buf1 +// Assign to buf2 +BigBuffer buf2 = buf1; +``` + +這會先產生buf1,然後把buf1 copy給buf2。如果我們想要省下copy的成本,這時候 Move assignment operator(就是 `=`)就可以派上用場了。 +幫