我最近了解std::move
和rvalue
参考,想知道我对它们的使用是否既合适又有效。
考虑这个简单的类,它只存储表示像素Image
的值数组。unsigned char
(请注意,实际上有比单个字符数组更多的成员,但为了便于阅读,我在此处进行了简化。)
using PixelContainer = std::vector<unsigned char>;
class Image {
public:
Image(PixelContainer&& pixels) : m_pixels(std::move(pixels)) {};
Image& operator=(Image&& image) { m_pixels = std::move(image.m_pixels); return *this; };
private:
PixelContainer m_pixels;
};
现在考虑一个ImageFactory
类的这个静态方法,它接受一个文件名 a.png
并返回一个Image
填充了适当像素值的对象。
Image ImageFactory::loadImage(const char* filename) {
PixelContainer temp_pixels;
// ... fill pixels from file (details not relevant here)
Image temp_image(std::move(temp_pixels));
return temp_image;
}
最后,它们一起在代码中使用,如下所示:
Image image = ImageFactory::loadImage("image.png");
我正在使用rvalue
引用来大概摆脱复制可能是大量像素值的任何时间。因为工厂创建的矢量和图像是临时的,它们可以移动。
我的问题是,我的实现是否有意义,如果它没有根本性的缺陷,是否可以进一步改进?