gpt4 book ai didi

.net - .Net如何基于C++模板知识实现泛型?

转载 作者:行者123 更新时间:2023-12-03 05:16:36 26 4
gpt4 key购买 nike

我了解 C++ 模板,但不懂 Java。

谁能帮我解释一下吗?

最佳答案

它们实际上以非常不同的方式实现。在 C++ 中,模板在编译时专门化,而 .Net 泛型在运行时专门化。

换句话说,C++ 代码如 MyClass<A> a使编译器执行模板参数替换并为该类生成二进制文件,就好像它在编译时是常规类一样。

这就是我的意思:

template<typename T>
class MyClass
{
public:
void Foobar(const T& a);
};

int main()
{
MyClass<int> myclass;
return 0;
}

它被编译成这样:

class MyClass_int // hypothetical class generated by compiler
{
public:
void Foobar(const int& a);
};

int main()
{
MyClass_int myclass;
return 0;
}

因此模板在编译的 C++ 代码的生成二进制文件中“不存在”。

在 .Net 中,同一行将导致编译器发出类的元数据,指示应在运行时替换泛型类型参数。实际上并没有听起来那么糟糕,因为 JIT 编译器应该能够巧妙地处理它们。

public class MyClass<T>
{
public void Foobar(T item) {}
}

这是用额外的信息编译的,表明它是一个通用类。 T参数在运行时使用时填写:

// This specialization occurs at runtime
MyClass<int> myclass = new MyClass<int>();

.Net 泛型不会尝试复制所有 C++ 模板功能。 C++ 模板的功能更加强大,但使用起来却更加困难(C++ 模板实际上是 Turing-complete )。

关于.net - .Net如何基于C++模板知识实现泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978946/

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