【问题标题】:Does typeid(T) get evaluated at run time or compile time?typeid(T) 是在运行时还是编译时评估?
【发布时间】:2013-09-17 21:02:31
【问题描述】:

我在任何地方都找不到这个看似简单的问题的答案。

以下 C++ 函数是否使用 RTTI?当然不必,但我想知道是否可以保证 typeid 将在编译时确定。

template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}

【问题讨论】:

  • 它将在什么对象上使用 RTTI?
  • @someone_smiley:如果编译器不知道 T 是什么,它如何生成正确的特化?
  • cpp 参考的“注释”部分说 (en.cppreference.com/w/cpp/language/typeid):“当应用于多态类型的表达式时,对 typeid 表达式的评估可能涉及运行时开销(虚拟表查找),否则typeid 表达式在编译时解析。"
  • @CharlesBailey: T 必须在编译时知道,否则程序无法编译。
  • @Watusimoto:如果你知道那我不明白你在问什么问题。

标签: c++ templates rtti


【解决方案1】:

由于typeid 应用于类型而不是对象,因此没有运行时类型信息,因此开销不会成为问题。

另一方面:据我所知,该标准对何时确定值没有任何要求,因此无法保证没有运行时开销。


编辑:
当然,(可能)没有保证这一事实并不意味着它不是一个合理的假设。
我无法想象有人会编写一个没有在编译时评估typeid(T)的编译器。

【讨论】:

    【解决方案2】:

    正如我在评论中提到的,cpp reference 上关于 typeid() 的“注释”部分说:

    当应用于多态类型的表达式时,typeid 表达式的评估可能涉及运行时开销(虚拟表查找),否则 typeid 表达式在编译时被解析。

    【讨论】:

    • 在这种情况下,T 是一个类型,而不是一个表达式。
    • @molbdnilo 所以表达式typeid(T) 在编译时被解析。 (编译器可能仍会在其上生成对std::type_info::name 的调用。)
    • @JamesKanze 为我没有阅读整个句子而感到羞耻......不过,我仍然无法在标准中找到任何关于编译时解析的参考。
    • @molbdnilo 我认为这就是他所引用的。你说得对;该标准没有做出任何保证(尽管当您使用带有类型名称的typeid 时,很难看出它会如何)。不过,他的消息来源有误。
    猜你喜欢
    • 2012-06-26
    • 2011-02-06
    • 2013-08-29
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多