一直困扰我的是,如果没有指定其他内容,为什么编译器不将数据设置为 NULL?我看不出有什么理由不这样做,而且它肯定比其他提到的垃圾更好?
最初的原因是“为了速度”——这些变量只有在你给它们分配了something后才有意义,所以我们努力不对即将被覆盖的
0
进行无意义的初始化无论如何,程序员都会在几毫秒内使用实际数据。
虽然它并不完全昂贵,但编译器今天可能不会出于同样的原因将变量清零:与基准测试中的其他编译器相比,任何这样做的编译器都会看起来很慢。
唯一好的理由是它效率不高。 C 和 C++(与高级语言不同)往往不会做任何您没有要求的事情。这就是他们如何获得速度极快的声誉的原因。其他语言更安全,但速度更慢。
如果您想将字段初始化为 NULL 以外的任何值,那么首先将其初始化为 NULL,然后然后将其初始化为您设置的任何值,这将是浪费时间。所以 C/C++ 假设你知道自己在做什么。
我的猜测是因为速度原因。它们将是另一个 CPU 调用来完成此操作。
将分配的内存设置为零并将结构标记为“null”需要时间。您的应用程序可能有时间关键的部分,其中必须尽快实例化对象,然后以尽可能简单的方式初始化它们以使它们可用。因此,编译器和运行时在创建对象时所做的工作尽可能少,并让您根据需要完成设置。
一些高级语言确实实现了对“null”的进一步初始化,但这些并不总是适合时间关键的应用程序。
如果您在堆上声明一个变量(不是自由存储,即全局并且仅全局),则该变量将被初始化为0。
但是,分配堆栈上的数据并不是为了加快速度。如果要覆盖数据,则将数据初始化为 0 是没有意义的,这是对本地(堆栈)数据所做的假设。