代码之家  ›  专栏  ›  技术社区  ›  Yin Zhu

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

  •  2
  • Yin Zhu  · 技术社区  · 15 年前

    我有C++模板的知识,但不懂Java。

    有人能给我解释一下吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   In silico    15 年前

    它们实际上是以非常不同的方式实现的。在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 )

        2
  •  1
  •   dsolimano    15 年前

    一种方法是在编译时进行模板扩展,但泛型是.NET中的一个运行时特性。

    C FAQ有一个 good article 以及面试环节,这些都克服了一些差异。