标记调度对象是否实际实例化

Are tag dispatching objects actually instantiated?

本文关键字:实例化 是否 对象 调度      更新时间:2023-10-16

考虑以下示例:

class MyHeavyObject
{
    MyHeavyObject()
    {
        // lots of initialisation
        // ...
    }
};
template<typename T>
void RegisterObject(T)
{
    DoSomethingWith<T>();
}

现在,如果我打电话给

RegisterObject(MyHeavyObject());

编译器会理解MyHeavyObject从未被实际使用并优化调用吗?还是会创建对象的实例?

我对标准所说的和编译器实际所做的都很感兴趣。

我会对标准的内容和内容感兴趣编译器实际上是这样做的。

只要可观察的行为保持不变,编译器就可以执行任意更改。这就是所谓的假设规则。

如果并且仅当MyHeavyObject的默认构造函数没有改变程序可观察行为的副作用时,参数和临时构造函数可能会被优化掉。

编译器有时很难发现这一点-它可能会优化无副作用的代码,它<em]可能不会>,这取决于它决定分析的程度以及代码的实际复杂程度。
我希望Clang和GCC都能正确地优化上面的代码(假设MyHeavyObject的默认构造函数相当简单),但我会测试它以确定。