什么是由字段初始化引起的有害代码爆炸的现实例子?

Dan*_*ury 10 .net c#

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建议的集中式构造函数产生更可读的代码.

Eri*_*ert 3

由字段初始化引起的有害代码爆炸的现实例子是什么?

我不知道这个问题的任何现实例子。

我无法想象这种情况会成为一个值得注意的问题

我也是。

这让我想知道我是否在这里遗漏了一些东西。

据我所知。

对于本世纪的任何计算机来说,这肯定是微不足道的内存量,对吧?

正确的。并且不要忘记,在一个紧张的世界中,你是要为游戏付出代价的。您只会获得与您调用的一样多的 ctor。

我想使用泛型可以将其乘以一个小因素

对于用值类型构造的泛型类型来说,这通常是正确的。

但对工作集的影响似乎仍然很小。

再次强调,工作集是按游戏付费的。只被调用几次的代码最终会被调出,并且许多构造函数在程序中只被调用几次。

我在这里遗漏了什么吗?如果是的话,是什么?

据我所知。

与使用 Richter 建议的集中式构造函数相比,初始化声明它们的字段似乎会产生更具可读性的代码。

我会首先针对正确性和优雅性进行优化,并且只有在经验性能测试清楚地表明这是一个真实的、影响用户的问题时才解决这个问题。