在CLR中通过C#,Richter注意到在类声明中初始化字段,就像这样
class C {
int x = 3;
int y = 4;
public C() { ... }
public C(int z) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
导致在每个构造函数的开头插入语句,将语句设置为提供的值.因此,int x = 3;上面的行将负责两个单独的初始化 - 一个在无参数构造函数中,另一个在构造函数中接受int参数.
里希特继续说:
这意味着你应该知道代码爆炸[...]如果你有几个初始化的实例字段和许多重载的构造函数方法,你应该考虑在没有初始化的情况下定义字段,创建一个执行公共初始化的构造函数,并让每个构造函数显式调用公共初始化构造函数.这种方法将减少生成代码的大小.
我很难想象这会成为一个明显的问题,让我想知道我是否在这里遗漏了一些东西.例如,如果我们想象我们的类有十个构造函数和一百个字段,并且需要16个字节的本机机器代码来执行初始化,那么我们讨论的是总共16 kB生成的本机代码.当然,本世纪任何计算机上的内存都可以忽略不计,对吧?
我想使用泛型可以乘以一个小因子,但仍然对工作集的影响似乎很小.
问题:我在这里遗漏了什么,如果是的话,那是什么?
虽然我的问题主要是理论上的 - 我想测试我自己的理解 - 它也有点实用,因为初始化它们被声明的字段似乎比使用像Richter建议的集中式构造函数产生更可读的代码.
由字段初始化引起的有害代码爆炸的现实例子是什么?
我不知道这个问题的任何现实例子。
我无法想象这种情况会成为一个值得注意的问题
我也是。
这让我想知道我是否在这里遗漏了一些东西。
据我所知。
对于本世纪的任何计算机来说,这肯定是微不足道的内存量,对吧?
正确的。并且不要忘记,在一个紧张的世界中,你是要为游戏付出代价的。您只会获得与您调用的一样多的 ctor。
我想使用泛型可以将其乘以一个小因素
对于用值类型构造的泛型类型来说,这通常是正确的。
但对工作集的影响似乎仍然很小。
再次强调,工作集是按游戏付费的。只被调用几次的代码最终会被调出,并且许多构造函数在程序中只被调用几次。
我在这里遗漏了什么吗?如果是的话,是什么?
据我所知。
与使用 Richter 建议的集中式构造函数相比,初始化声明它们的字段似乎会产生更具可读性的代码。
我会首先针对正确性和优雅性进行优化,并且只有在经验性能测试清楚地表明这是一个真实的、影响用户的问题时才解决这个问题。
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |