gpt4 book ai didi

c++ - 是否构造了虚拟参数的对象参数?

转载 作者:IT老高 更新时间:2023-10-28 23:11:05 25 4
gpt4 key购买 nike

假设一个函数模板:

template <class T>
void foo(T /* dummy */) {...}

假设 foo 是这样调用的:

foo(Widget());

在这种情况下会构造一个 Widget 对象吗?

This post就未使用的参数提出了类似的问题(并且虚拟参数的参数肯定是未使用的)。答复表明,除非通过函数指针调用函数,否则编译器将优化未使用的参数。

但是,请考虑 Alexandrescu 的 Modern C++ 第 2.5 节中的以下文本:

Now say there is a rule in your application: Objects of type Widget are untouchable legacy code and must take two arguments upon construction, the second being a fixed value such as -1. Your own classes, derived from Widget, don't have this problem.

...

In the absence of partial specialization of functions, the only tool available is, again, overloading. A solution would be to pass a dummy object of type T and rely on overloading:

template <class T, class U>
T* Create(const U& arg, T /* dummy */)
{
return new T(arg);
}
template <class U>
Widget* Create(const U& arg, Widget /* dummy */)
{
return new Widget(arg, -1);
}

Such a solution would incur the overhead of constructing an arbitrarily complex object that remains unused.

这表明编译器不够聪明,无法避免为虚拟参数构造参数...

那么,哪个是正确的?如果 Alexandrescu 是正确的,那为什么不进行这种优化呢?

最佳答案

创建对象可能会产生副作用。

除非编译器可以证明没有副作用发生,或者标准中没有规定副作用发生的部分,否则在 as -if(编译器可以对你的代码做任何事情,只要它表现得好像他们没有做改变,达到标准的要求)或省略(在某些情况下你合并某些对象的生命周期,甚至如果它的行为不像你没有合并它们)规则。

例如,假设小部件在一个中心位置注册了它们的存在。创建对象时,存在的 Widget 数量会增加 1 - 根据标准,不发生这种情况是非法的。

即使没有副作用,证明没有副作用需要编译器收集创建 Widget 所涉及的所有代码,并分析它以“最终什么都不做” .这可以从困难(具有特殊“对象将在 Y 时间消失”约束以确定是否强制执行任何副作用的大量代码的链接时优化)到不可能(我们正在谈论分析非图灵完备计算结果的琐碎性质)。

所有这些都是针对一个相对奇怪的极端情况,“有人无缘无故地创建了一个对象,然后在没有使用它的情况下将其丢弃”。

关于c++ - 是否构造了虚拟参数的对象参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32696051/

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