可以通过内联实现值类型吗?

时间:2011-09-11 07:32:23

标签: c# jvm language-design value-type vm-implementation

当我第一次看到C#中的值类型时,我首先想到的是“哇,这是一个多么伟大的优化”,第二件事是“我们真的需要一个新的语言构造吗?”我们不能用而不是注释?“。

这个想法是,给定一个课程,我们会像往常一样使用它

class A {int i;}
class B {
    A m_a;
    int F(A a) {m_a = a;}
}

我们会随心所欲地将A更改为

[ValueType]
class A {int i;int j;}

编译器会自动将类B转换为

class B {
#region A
    int A_i;
    int A_j;
#endregion
int F(/*A param*/int i,int j) {
#region A_assign
    A_i = i;
    A_j = j;
#endregion
}

请记住,如果编译器不希望优化某些实例 - 它不必。无论哪种方式都可以。

模板可能会出现问题,

int f<T>() {
    T t; // how much stack should I allocate
}

但我不确定它比目前的情况更糟糕。我实际上不确定现在发生了什么(f<struct_of_100_bytes>是一个与f<int>不同的函数?)。

1 个答案:

答案 0 :(得分:2)

现在想象一下继承。或阵列。或论点。或仿制药。或者实现一个接口。或者分配给object / dynamic。

请记住,运行时支持多个编译器。

拥有一个特定的关键字(struct)而不是一个属性并不是一个很大的变化(事实上,就CLI来说,所有东西都被称为一个类),但整体情况要比你的例子复杂得多。

基本上,struct会提供你提到的所有内容,并且可以在列出的所有场景中使用。由于它通常(对于本地人)使用堆栈,因此它的行为与您描述的非常相似。

重新提出“单独功能”问题;首先,泛型不是“模板”(它是运行时与编译时)。但是泛型每个值类型获得一个JIT,每个引用类型获得一个JIT(因为确实:堆栈布局发生了变化。