此C ++编译器优化的名称是什么(在其自身的实例上调用对象自己的构造函数,它是如何工作的?

问题描述 投票:2回答:1

我正在尝试学习C ++中的资源管理,在我的研究中,我遇到了一个有趣的优化。基本上,当使用复制构造函数初始化堆栈上的对象时,该对象是一个右值对象(是右值吗?),而不是调用该构造函数然后调用move构造函数,编译器只是调用原始Object的构造函数。

Object c(Object(1)); // This is the same as Object c(1);
Object c(Object(Object(Object(Object(Object(1)))))); // This is also the same as Object c(1);
Expected flow:
1. Object(1) calls the constructor and creates a nameless Object that will be removed as soon as it's created.
2. c notices this is an rvalue, and calls the move constructor.
3. Destructor for Object(1) is called.
Actual flow:
1. c(1) is called.

这很聪明,但是。如何?这招背后的机制是什么?即使Object的构造函数接受指针和许多参数,此方法也有效。

c++ c++11 compiler-optimization
1个回答
4
投票

在C ++ 17之前,此行为属于copy elisionObject(x)指定创建一个临时对象,但是在某些情况下,编译器可以自行决定忽略创建和销毁所有临时对象。

© www.soinside.com 2019 - 2024. All rights reserved.