如果存储参数

时间:2015-06-26 01:24:28

标签: c++

如果在以下情况下存储参数,则复制参数

传递了文字字符串:

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 ++是否优化以防止在上述任何情况下制作不必要的副本?

3 个答案:

答案 0 :(得分:1)

  

C ++是否优化以防止在上述任何情况下制作不必要的副本?

没有。

标准只是保证在第1和第2种情况下,使用strglobalStr的值复制到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;

无法编译。必须在引用时为引用分配引用。