如果代码更改为 std::move(vector) 将在此函数中保存复制操作
If code changed to std::move(vector) will that save a copy operation in this function
函数是将文件内容提取到一个向量中,如下所示:
std::vector<uint8_t> GetFileContents(const std::string& filename)
{
std::ifstream file(filename, std::ios::binary);
if (!file.good())
{
return {};
}
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
}
线上:
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
fileData 向量被复制到一个临时向量中以在此处返回?
我需要更改为:
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return std::move(fileData);
要进行移动并保存矢量复制操作?
功能中是否需要任何其他更改以支持移动?
空 case std::move({}) 中有任何值吗?
不,你不应该在那里使用 std::move
。
这避免了可能的NRVO,而且无论如何都有一个隐含的举动。
有关详细信息,请参阅 Automatic_move_from_local_variables_and_parameters。
函数是将文件内容提取到一个向量中,如下所示:
std::vector<uint8_t> GetFileContents(const std::string& filename)
{
std::ifstream file(filename, std::ios::binary);
if (!file.good())
{
return {};
}
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
}
线上:
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
fileData 向量被复制到一个临时向量中以在此处返回?
我需要更改为:
std::vector<uint8_t> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return std::move(fileData);
要进行移动并保存矢量复制操作?
功能中是否需要任何其他更改以支持移动?
空 case std::move({}) 中有任何值吗?
不,你不应该在那里使用 std::move
。
这避免了可能的NRVO,而且无论如何都有一个隐含的举动。
有关详细信息,请参阅 Automatic_move_from_local_variables_and_parameters。