gpt4 book ai didi

c++ - 复制省略法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:29 28 4
gpt4 key购买 nike

来自复制省略法的标准定义:

In C++ computer programming, copy elision refers to a compiler optimization technique that eliminates unnecessary copying of objects.

让我们考虑以下代码:

#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C
{
C (int) {}
C(const C&) {++n;}



};
int main(int argc, char *argv[])
{
C c1(42);
C c2=42;




return n;
}

“return n”这一行将返回 0 或 1,具体取决于拷贝是否被删除。

还要考虑这段代码:

#include <iostream>

struct C {
C() {}
C(const C&) { std::cout << "Hello World!\n"; }
};

void f() {
C c;
throw c; // copying the named object c into the exception object.
} // It is unclear whether this copy may be elided.

int main() {
try {
f();
}
catch(C c) {
}
}

它是这样说的

// copying the exception object into the temporary in the exception declaration.
//It is also unclear whether this copy may be elided.

所以我的问题是,如果有时结果不确定,那么实现这种优化方法有多大用处?通常它的使用频率是多少?

最佳答案

重要的一点是标准明确允许这样做,这意味着您不能假设复制构造函数的副作用将被执行,因为拷贝可能会被省略。该标准要求 copy-constructor 的实现具有 copy-constructor 语义,也就是说,整个目的是在您的域中生成第二个语义等同于原始对象。如果您的程序符合这一点,那么优化将不会影响程序。

这是真的,另一方面,这是我能想到的唯一一种情况,标准允许同一程序根据编译器的行为产生不同的可见结果,但你被告知你不应该复制构造函数中的副作用(或者更确切地说,您不能依赖执行的确切复制数量)。

至于是否值得,是的。在许多情况下,拷贝非常昂贵(我在讨论中故意忽略了 C++11 中的移动构造函数)。考虑一个返回 vector<int> 的函数,如果没有删除拷贝,则需要进行另一次动态分配,复制所有 vector 内容,然后释放原始内存块,所有这三个操作都可能很昂贵。

或者,您可以强制用户更改他们的代码以创建一个空对象并通过引用传递它,但这会使代码更难阅读。

关于c++ - 复制省略法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607598/

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