小编CPW*_*CPW的帖子

为什么这个泛型方法调用基类方法,而不是派生类方法?

对于以下代码:

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# generics

6
推荐指数
2
解决办法
322
查看次数

为什么C++虚拟调用并不比非虚拟调用慢?

在我的理解中,对于C++虚拟调用,它需要:

  1. 从符号表中获取对象的类型
  2. 从类型表中获取v表
  3. 使用v表中的函数签名搜索函数
  4. 调用该函数.

而对于非虚拟(例如在C)呼叫,仅需要#4.

我认为#3应该是最耗时的.鉴于C++中实时覆盖的性质,我看不到上述步骤的编译时间优化的可能性.因此,对于具有长函数签名的复杂类继承,C++虚拟调用应该比非虚拟调用慢得多.

但所有的说法都是相反的,为什么?

c++ performance

5
推荐指数
2
解决办法
1020
查看次数

为什么在 C++ 概念示例中添加对 std::array 的支持会导致“调用时没有匹配的函数”编译错误?

我正在使用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)

c++ c++-concepts

-1
推荐指数
1
解决办法
132
查看次数

标签 统计

c++ ×2

c# ×1

c++-concepts ×1

generics ×1

performance ×1