gpt4 book ai didi

C++:调用临时对象的构造函数

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

假设我有以下内容:

int main() {
SomeClass();
return 0;
}

如果不优化,会调用SomeClass()的构造函数,然后调用它的析构函数,对象就没有了。

但是,根据 IRC channel ,如果编译器认为对 SomeClass 构造函数/析构函数没有副作用,则可以优化构造函数/析构函数调用。

我想解决这个问题的明显方法是不使用某些构造函数/析构函数(例如使用函数或静态方法等),但是有没有办法确保构造函数/析构函数的调用?

最佳答案

However, according to an IRC channel that constructor/destructor call may be optimized away if the compiler thinks there's no side effect to the SomeClass constructors/destructors.

粗体部分错误。那应该是:知道没有可观察到的行为

例如来自最新标准的 § 1.9(有更多相关引用):

A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input. However, if any such execution contains an undefined operation, this International Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation).

事实上,整个机制支撑着最普遍的 C++ 语言习语: Resource Acquisition Is Initialization

背景

让编译器优化掉琐碎的 case-constructors 非常有帮助。它允许迭代器编译为与使用原始指针/索引器完全相同的性能代码。

这也是允许函数对象编译为与内联函数体完全相同的代码的原因。

这就是使 C++11 lambdas 完美最适合简单用例的原因:

factorial = std::accumulate(begin, end, [] (int a,int b) { return a*b; });

lambda 编译成一个仿函数对象类似于

struct lambda_1
{
int operator()(int a, int b) const
{ return a*b; }
};

编译器发现可以省略构造函数/析构函数,并内联函数体。最终结果是最优的1


更多(不可)观察到的行为

该标准包含一个非常有趣的相反示例,以激发您的想象力。

§ 20.7.2.2.3

[ Note: The use count updates caused by the temporary object construction and destruction are not observable side effects, so the implementation may meet the effects (and the implied guarantees) via different means, without creating a temporary. In particular, in the example:

shared_ptr<int> p(new int);
shared_ptr<void> q(p);
p = p;
q = p;

both assignments may be no-ops. —end note ]

IOW:不要低估优化编译器的力量。这绝不意味着语言保证将被抛到窗外!

1 虽然可能有更快的算法来获得阶乘,但这取决于问题领域:)

关于C++:调用临时对象的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287010/

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