如果参数已存储,它们是否会被复制
Do arguments get copied if they're stored
如果将参数存储在以下情况下,是否会复制它们
传递的文字字符串:
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++是否进行了优化以防止生成不必要的副本?
在上述任何一种情况下,C++是否进行了优化以防止生成不必要的副本?
没有。
标准只是保证在第一种和第二种情况下,str
的值将使用std::string::operator=()
复制到globalStr
。
根据STL的实现,如果std::string
使用写时复制优化,则可能会避免深度复制。
第三种情况将不会编译,因为引用在初始化后无法重新分配。
在前两个示例中,您正在绑定一个引用:void store(const std::string &str)
,它本身并不复制。
但在将分配给全局变量的语句中:globalStr = str;
-它会复制它。
在您的第三个示例中,它不编译:std::string &globalStr;
-引用需要初始化!
你可以试着写下:
void store(std::string &&str)
{
globalStr = std::move(str);
}
store(std::move(varStr));
在任何涉及编译器优化的情况下:这取决于编译器。
如果编译器被编程为(并且可以在给定的情况下)向自己证明复制是不必要的,那么它就不会执行该复制。
对于您的特定问题,前两个方法都不能执行不必要的复制,因为输入是通过引用传递到store
函数中的。当您将它们分配给globalStr
时,它们会被复制,但该复制是必需的,因为globalStr
是一个值变量;它是自己的副本,因此不能指向其他副本。
这一行:
std::string &globalStr;
无法编译。引用在声明时必须指定要引用的内容。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 如何检查文件是否复制成功?(便携式解决方案)C++
- 在此示例中,向量是否复制了两次
- 修改时是否复制C++中的字符串
- OpenMP 是否复制私有对象
- STL 集合的插入方法是否复制传递对象的值?
- 继承中的基类是否复制到派生类
- 在结构中复制构造函数:是否复制数组
- 成员初始化列表是否复制字符串C++
- 这是否复制了矢量
- Mat::p ush_back(x) 是否复制 x 元素