c# - 值类型可以通过内联来实现吗?

标签 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;}

并且编译器会自动转换class 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> 不同的函数吗?)。

最佳答案

现在想象一下继承。或数组。或争论。或泛型。或者实现一个接口(interface)。或者分配给对象/动态。

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

拥有一个特定的关键字(结构)而不是一个属性并不是一个很大的变化(实际上,就 CLI 而言,一切都称为类),但总体情况比您的示例复杂得多。

基本上,struct 几乎可以完成您提到的所有事情,并且适用于列出的所有场景。由于它通常(对于本地人)使用堆栈,因此它的行为已经很像您描述的那样。

关于“分离功能”的问题;首先,泛型不是"template"(它是运行时与编译时)。但是泛型为每个值类型获得一个 JIT,为每个引用类型获得一个 JIT(因为确实:堆栈布局发生了变化。

关于c# - 值类型可以通过内联来实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376917/

相关文章:

jvm - JVM 操作数栈必须是确定性的吗?

clojure - 如果像 Dylan、Julia 和 Seph 那样放弃前导括号,Clojure 会失去什么?

java - 在 Java 上使用 DSL 的第一步?

c# - 将 IEnumerable.Aggregate 与异步调用结合使用

java - 为什么大多数java.lang.reflect.Array类方法都是 'native'

c# - 如何将 System.Net.ICredentials 传递给 API?

parameters - 如何设置JVM参数

php - 为什么PHP不支持多线程?

c# - 如何模拟/ stub Nhibernate QueryOver 调用?

c# - 样式和脚本在局部 View 中不起作用