gpt4 book ai didi

c++ - 未命名对象的 RVO(返回值优化)是否是普遍保证的行为?

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

This question在不同方面(也仅限于 gcc)。我的问题仅适用于未命名对象Return Value Optimization 被允许改变结果程序的可观察行为。标准中似乎也提到了这一点。

但是,这个“允许” 术语令人困惑。这是否意味着 RVO 保证在每个编译器上发生。由于 RVO 下面的代码改变了它的可观察行为:

#include<iostream>
int global = 0;
struct A {
A(int *p) {}
A(const A &obj) { ++ global; }
};

A foo () { return A(0); } // <--- RVO happens
int main () {
A obj = foo();
std::cout<<"global = "<<global<<"\n"; // prints 0 instead of 2
}

这个程序是否应该为所有实现打印 global = 0,而不考虑编译器优化和 foo 的方法大小?

最佳答案

根据标准,程序可以打印0、1或2。C++11中的具体段落是12.8p31,开头为:

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the copy/move constructor and/or destructor for the object have side effects.

请注意,两个复制省略都不是属于 as-if 规则的优化(它要求程序的行为与同一程序的行为as-如果没有发生优化)。该标准明确允许实现生成不同的可观察行为,程序员是否让您的程序不依赖于此(或接受所有三种可能的结果)取决于您。

注2:任何答案中都没有提到1,但这是一个可能的结果。有两个潜在的拷贝发生,从函数中的局部变量到返回的对象到 main 中的对象,编译器可以省略一个,一个或两个拷贝生成所有三种可能的输出。

关于c++ - 未命名对象的 RVO(返回值优化)是否是普遍保证的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8410877/

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