对于以下代码:
class B
{
public String G() { return "B.G()"; }
}
class D : B
{
public String G() { return "D.G()"; }
}
class TestCompile
{
private static String TestG<T>(T b) where T: B
{
return b.G();
}
static void Main(string[] args)
{
TestG(new D());
}
}
Run Code Online (Sandbox Code Playgroud)
结果是B.G(),而类似的C++代码的结果将是D.G().
为什么会出现这种差异?
在我的理解中,对于C++虚拟调用,它需要:
而对于非虚拟(例如在C)呼叫,仅需要#4.
我认为#3应该是最耗时的.鉴于C++中实时覆盖的性质,我看不到上述步骤的编译时间优化的可能性.因此,对于具有长函数签名的复杂类继承,C++虚拟调用应该比非虚拟调用慢得多.
但所有的说法都是相反的,为什么?
我正在使用cppreference.com - Constraints and Concepts (Since C++20)中的示例学习 C++ 概念,我将在此处将其重现为:
template <typename T>
requires std::integral<T> || std::floating_point<T>
constexpr double average(std::vector<T> const &vec) {
const double sum = std::accumulate(vec.begin(), vec.end(), 0.0);
return sum / vec.size();
}
int main()
{
std::vector sVec { 1, 2, 3, 4, 5};
assert(average(sVec) == 3);
}
Run Code Online (Sandbox Code Playgroud)
我添加了 std::array 的情况:
template <typename T, int size> // add size
requires std::integral<T> || std::floating_point<T>
constexpr double average(const std::array<T, size> &arr) { // use std::array<T, size> &arr) instead
const double …Run Code Online (Sandbox Code Playgroud)