Compiler Optimization with return (std::stringstream ss).str
Compiler Optimization with return (std::stringstream ss).str()
以下函数接受一个字符串作为参数,并在经过一些处理后返回另一个字符串。
-
假设编译器将执行移动优化,并且我最终不会在每次调用后复制字符串的内容是否足够公平?此函数是否应遵循复制省略 [(N)RVO]?
-
作为一种做法,这是可取的吗?
std::string foo(std::string const& s)
{ // Perform sanity check on s
// ...
std::stringstream ss;
// do something and store in ss
// ...
return ss.str();
}
因为,否则,我通常遵循通过引用返回字符串的做法。所以,可以说,我的函数签名应该是:
void foo (std::string const& inValue, std::string& outValue);
ss.str()
将创建一个临时字符串。 如果要将该字符串分配给新实例,例如
std::string bar = foo("something");
复制省略或移动语义将启动。
现在,如果您已经创建了一个字符串,并且您正在将其分配给foo
的返回,那么移动分配将开始
std::string bar;
// do stuff
bar = foo("something");
我更喜欢这种方法,因为它不需要您已经创建了一个对象,其中
void foo (std::string const& inValue, std::string& outValue);
会让你创建一个空字符串只是为了将其传递给函数进行填充。 这意味着你有一个构造和一个作业,在第一个示例中,你可以有一个构造。
根据这一点,当您返回值时,它会更加优化:
返回值优化 (RVO) 允许编译器通过让调用方和被调用方对两个"副本"使用相同的内存块来优化副本。
相关文章:
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 如何在C++中将 chrono::秒转换为 HH:MM:SS 格式的字符串?
- 如何从远程 SFTP 服务器获取 HH-MM-SS 时间戳格式的文件列表
- 如何将时间字符串 (M:SS) 转换为浮点数
- 使用 "stringstream " 将字符串转换为整数
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- std::stringstream 返回字符 *
- 格式化时间 c++ dd/mm/yyyy hh:ss.
- std::stringstream::flush() 应该做什么吗?
- 如何在C++中将秒更改为 HH:MM:SS 格式?
- 静态 std::stringstream 的叮当整警告
- Stringstream编译错误仅发生在linux环境中
- "stringstream"复制构造它的字符串吗?
- 为什么"std::stringstream::stringstream(std::string&&)"不存在?
- 为什么 {fmt} 比 std::stringstream 慢?
- C++命令末尾的 std::stringstream 空格
- 返回 std::stringstream - 编译失败
- Qt c++ 聚合'std::stringstream ss'类型不完整且无法定义
- Compiler Optimization with return (std::stringstream ss).str