gpt4 book ai didi

c++ - 编译器在返回作为常量引用的字符串时是否避免复制?

转载 作者:太空狗 更新时间:2023-10-29 21:36:25 26 4
gpt4 key购买 nike

我想知道编译器是否会在以下情况下优化掉拷贝。我有一个类,其唯一的资源成员是一个可能有几 KB 大的字符串。我想让这个类的一个公共(public)成员访问那个字符串,但我不确定我是否应该让这个成员返回一个引用或者只是按值返回。假设我选择像这样按值返回

class A { 
public:
A();
~A();
std::string getString() { return str; }
private:
std::string str;
}

int main() {
A *a = new A;
const std::string& str = a->getString();
std::cout << str;
}

如果我将结果作为main中的const std::string&,编译器会优化并避免复制吗?

最佳答案

这在很大程度上是可能的,但编译器不太可能在这种用例中优化掉拷贝。

请注意,如果拷贝被优化掉,调用者的临时对象基本上会绑定(bind)为对象类成员的 const 引用。而const表示引用的值不能改变。

仅使用此问题中显示的代码,编译器可能会向自己证明,当 const 引用保留在范围内时,没有任何东西可以更改类成员的内容,因此它进行此优化是安全的。

但在更普遍的情况下,事情很快就会变得困惑。如果有其他类方法可能会更改被引用类成员的内容,如果在 const 引用的生命周期内有任何调用其定义不可见的函数或方法;最可能的结果是编译器无法知道在 const 引用的整个执行范围内是否有可能修改引用的类成员,因此它将被迫制作一个拷贝的字符串,以保证其 const-ness。

编译器可以自由地只进行那些不会在格式良好的程序中产生可见的、观察到的变化的优化。如果编译器无法证明优化结果没有可见的、可观察到的变化,则不会执行优化。

附言请注意,“修改”还包括销毁。提议的优化将 const 引用绑定(bind)到动态范围内的对象。如果中间有任何对 delete 的调用——显式或隐式地作为对各种库容器方法调用的一部分——编译器还必须向自己证明 delete d 对象不能是具有绑定(bind) const 引用的对象。

关于c++ - 编译器在返回作为常量引用的字符串时是否避免复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com