vault backup: 2022-06-09 14:00:26
Affected files: 02. PARA/03. Resources(資源)/C++17/rvalue.md
This commit is contained in:
@@ -35,8 +35,53 @@ int& c = r;
|
|||||||
|
|
||||||
了解rvalue reference之後,就可以實作類別的 move constructor 跟move assignment operator。
|
了解rvalue reference之後,就可以實作類別的 move constructor 跟move assignment operator。
|
||||||
|
|
||||||
## Move constructor
|
## Move assignment operator
|
||||||
Mov
|
假設我們有一個class叫BigBuffer,定義如下:
|
||||||
|
```cpp
|
||||||
|
class BigBuffer {
|
||||||
|
public:
|
||||||
|
BigBuffer(int size=100*1024*1024) :
|
||||||
|
bufferSize(size)
|
||||||
|
{
|
||||||
|
std::cout << "BigBuffer constructor\n";
|
||||||
|
this->buffer = std::make_unique<uint8_t[]>(bufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
~BigBuffer() {
|
||||||
|
std::cout << "BigBuffer destructor\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
BigBuffer(const BigBuffer& src) {
|
||||||
|
std::cout << "BigBuffer copy constructor\n";
|
||||||
|
bufferSize = src.bufferSize;
|
||||||
|
buffer = std::make_unique<uint8_t[]>(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<uint8_t[]>(bufferSize);
|
||||||
|
std::memcpy(buffer.get(), src.buffer.get(), bufferSize);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int bufferSize = 0;
|
||||||
|
std::unique_ptr<uint8_t[]> 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(就是 `=`)就可以派上用場了。
|
||||||
|
幫
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user