Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在具有vtable的类上调用非虚拟函数是否可以动态调度?_C++ - Fatal编程技术网

C++ 在具有vtable的类上调用非虚拟函数是否可以动态调度?

C++ 在具有vtable的类上调用非虚拟函数是否可以动态调度?,c++,C++,我假设答案是否定的,它将被静态调度。但我想确定一下。我知道这都是特定于实现的,但总的来说。。。。。?谢谢。如果它不是虚拟的,就不会动态调度。即使该类具有其他虚拟函数,那些不是虚拟函数的函数也将静态绑定 C++的座右铭是你不应该为你不使用的东西付费。在这种情况下,如果没有指定需要(通过声明函数virtual),则不需要为动态调度函数付费。如果您是正确的,答案是否定的,它将被静态调度。虚拟分派机制是一种“选择加入”功能,通过使用virtual关键字。vtable是特定于实现的,被调用函数的可观察行为

我假设答案是否定的,它将被静态调度。但我想确定一下。我知道这都是特定于实现的,但总的来说。。。。。?谢谢。

如果它不是虚拟的,就不会动态调度。即使该类具有其他虚拟函数,那些不是虚拟函数的函数也将静态绑定


C++的座右铭是你不应该为你不使用的东西付费。在这种情况下,如果没有指定需要(通过声明函数
virtual
),则不需要为动态调度函数付费。

如果您是正确的,答案是否定的,它将被静态调度。虚拟分派机制是一种“选择加入”功能,通过使用
virtual
关键字。vtable是特定于实现的,被调用函数的可观察行为不是。如果在编译时已知对象类型,则即使虚拟函数也可能被静态分派。@Boperson:True,即使它是错误的类型()。值得注意的是,这些都不是语言规范强制要求的。如果您想知道您的实现在做什么,请务必查看编译器的输出。实现不太可能对可以在编译时决定的内容实现动态分派,但存在奇怪的编译器。@IInspectable-很抱歉,你的评论有点倒退。非虚拟函数不受动态调度的约束,这是强制的。虚拟函数可以静态解析,但这不是本文的主题。语言规范中没有任何规定,非虚拟函数不能放在v表中。兼容的实现ation可能会选择将所有类成员放入一个v表中,并执行动态分派。我看不出这是怎么回事。这不太可能,而且我想不出这样做的理由。但有一些奇怪的编译器,它们的作者可能有理由做一些看似不必要的事情。实际上,我认为@IInspectable在某种程度上是正确的。对非虚函数的调用必须以静态确定的函数结束(我们都同意这一点)-但它可能会通过vtable的间接寻址而结束。是否调用该动态分派是一个术语问题。@MartinBonner:正确。语言规范中没有禁止动态分派的内容,即使目标可以在编译时确定。因此,语句“如果它不是虚拟的,则不会动态调度。"是错误的。很有可能,一个实现选择不在编译时可以确定的事情上花费时钟周期。但是根本没有这样做的要求,一个兼容的实现可以选择执行动态调度。除非措辞是固定的,否则可能不得不否决此提交。