如果在以下情况下存储参数,则复制参数
传递了文字字符串:
std::string globalStr;
void store(const std::string &str)
{
globalStr = str;
}
store("Literal");
传递变量字符串:
std::string globalStr;
void store(const std::string &str)
{
globalStr = str;
}
store(varStr);
如果globalStr存储引用
,该怎么办?std::string &globalStr;
void store(const std::string &str)
{
globalStr = str;
}
store("Literal"); //Should this cause any problem?
store(varStr);
C ++是否优化以防止在上述任何情况下制作不必要的副本?
答案 0 :(得分:1)
C ++是否优化以防止在上述任何情况下制作不必要的副本?
没有。
标准只是保证在第1和第2种情况下,使用str
将globalStr
的值复制到std::string::operator=()
。
根据STL的实现,如果std::string
使用写时复制优化,则可能会避免使用深层复制。
第三种情况不会编译,因为在初始化之后无法重新分配引用。
答案 1 :(得分:1)
在前两个示例中,您绑定了一个引用:void store(const std::string &str)
,它本身就而不是副本。
但是在将分配给全局变量的语句中:globalStr = str;
- 它 复制它。
在你的第三个例子中,这不能编译:{{1}} - 需要初始化引用!
您可以尝试通过以下方式设置移动:
std::string &globalStr;
答案 2 :(得分:0)
与任何涉及编译器优化的情况一样:它取决于编译器。
如果编译器被编程为(并且可以在给定的情况下)证明自己不需要复制,则不会执行该复制。
对于您的特定问题,前两种方法都不能执行不必要的副本,因为输入通过引用传递到store
函数。将它们分配给globalStr
时会复制它们,但该副本必需,因为globalStr
是值变量;它是它自己的副本,因此不能指向其他副本。
这一行:
std::string &globalStr;
无法编译。必须在引用时为引用分配引用。