标记调度对象是否实际实例化
Are tag dispatching objects actually instantiated?
考虑以下示例:
class MyHeavyObject
{
MyHeavyObject()
{
// lots of initialisation
// ...
}
};
template<typename T>
void RegisterObject(T)
{
DoSomethingWith<T>();
}
现在,如果我打电话给
RegisterObject(MyHeavyObject());
编译器会理解MyHeavyObject
从未被实际使用并优化调用吗?还是会创建对象的实例?
我对标准所说的和编译器实际所做的都很感兴趣。
我会对标准的内容和内容感兴趣编译器实际上是这样做的。
只要可观察的行为保持不变,编译器就可以执行任意更改。这就是所谓的假设规则。
如果并且仅当MyHeavyObject
的默认构造函数没有改变程序可观察行为的副作用时,参数和临时构造函数可能会被优化掉。
编译器有时很难发现这一点-它可能会优化无副作用的代码,它<em]可能不会>,这取决于它决定分析的程度以及代码的实际复杂程度。
我希望Clang和GCC都能正确地优化上面的代码(假设MyHeavyObject
的默认构造函数相当简单),但我会测试它以确定。
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 检查类是否在方法中实例化
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 是否可以将指向未实例化的对象的指针用作C++中的变量?
- 初始值设定项列表是否足够静态以允许实例化模板?
- 如果专用化已经隐式实例化,它是否隐式实例化?
- 从模板基类派生是否在派生类声明的点实例化模板
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 是否实例化了所有有效的模板
- 检查类型是否为模板的实例化
- C++标准是否明确允许/禁止实例化不完整类型的 std::函数?
- 是否可以实例化具有已删除构造函数和析构函数的非聚合类?
- 模板类静态在最终二进制文件中跨共享库以不同方式实例化是否一致
- 派生类的实例化是否为基类的私有成员分配内存
- 自定义类的const实例化是否也会使类中的*everything*变为常量
- C++类实例化是否可以在运行时更改其大小
- 类模板的动态实例化是否被视为显式或隐式
- 类模板的所有实例化是否可以共享相同的模板独立成员函数
- C++中的对象实例化是否存在显著的固有成本