值类型可以通过内联实现吗?
本文关键字:实现 类型 可以通过 | 更新日期: 2023-09-27 18:08:08
当我第一次看到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>
不同的功能吗?)。
现在想象一下继承。或数组。或参数。或泛型。或者实现一个接口。或者赋值给object/dynamic.
请记住运行时支持多个编译器。
使用特定的关键字(struct)而不是属性并不是什么大的变化(实际上,在CLI中,所有东西都称为类),但总体情况比您的示例要复杂得多。
基本上,struct几乎完成了您提到的所有工作,并在列出的所有场景中工作。因为它通常(对于局部变量)使用堆栈,它的行为已经像你描述的那样了。
关于"分离功能"的问题;首先,泛型不是"模板"(它是运行时与编译时的对比)。但是泛型每个值类型都有一个JIT,每个引用类型都有一个JIT(因为堆栈布局确实发生了变化)。