作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在this答案,有人提到,当按值将变量传递给函数或作为函数的返回值传递变量时,不一定会调用复制构造函数。有人可以解释这种情况发生的时间和原因吗?另外,在这种情况下,编译器如何设法返回结果?
最佳答案
如前所述,这是 Return value optimization和 Copy elision .
当新创建并复制对象时,这可能会发生。在这种情况下,允许编译器对其进行优化,以便直接在正确的位置创建新对象,而无需复制(也不会调用复制构造函数)。
例如:
struct A {};
void test(A a) {}
int main() {
test(A()); // probably there will be no copy here
}
对于返回,也是类似的。您创建一个新对象,然后如果您返回它,这将涉及一个拷贝,但允许编译器优化该拷贝(以及对复制构造函数的调用)。
例如:
A returnANewA() {
return A(); // copying would take place here
}
int main() {
A a = returnANewA(); // the compiler is allowed to do that without copying
}
编译器如何做到这一点:根据调用约定,它知道返回值必须存储在堆栈中的什么位置。在其他情况下,如果编译器知道函数代码,它当然会有所帮助。但这一切都取决于架构(x86 或其他)和编译器(GCC、Microsoft 或其他)。该标准只是说允许编译器省略对复制构造函数的调用。
如果您对有关调用约定的一些与平台相关的详细信息感兴趣,请参阅此处的一些链接。但是请注意,这些细节并不重要。您所需要知道的是,允许编译器优化复制构造函数调用(在大多数情况下会这样做)。
关于c++ - 传递或返回变量时并不总是调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19446795/
我是一名优秀的程序员,十分优秀!