ozm*_*zmo 8 c++ memory mapping variables initialization
在许多语言中,您可以声明变量并在初始化之前使用它.
例如,在C++中,您可以编写一个代码段,例如:
int x;
cout << x;
Run Code Online (Sandbox Code Playgroud)
这当然会返回不可预测的(好吧,除非你知道你的程序如何映射出内存)结果,但我的问题是,为什么编译器允许这种行为?
允许使用未初始化的内存会导致某些应用程序或效率吗?
编辑:我想到,将初始化留给用户会最大限度地减少对寿命有限(写周期)的内存介质的写入.只是上述"绩效"标题下的一个具体例子.谢谢.
pax*_*blo 13
我的想法(以前我错了,只问我的妻子)是因为它只是早期语言化身的延续.
C的早期版本不允许你在函数中的任何地方声明变量,它们必须位于顶部(或者可能在块的开头,因为我很少这样做,所以很难记住我的头脑如今).
此外,只有当您知道它应该是什么时,您才有可能理解设置变量的愿望.如果你要做的下一件事就是覆盖那个值(这就是人们来自这里的表现),那么将变量初始化为某些东西是没有意义的.
这就是为什么有必要允许未初始化的变量,尽管在初始化它们之前仍然不应该使用它们,并且好的编译器有警告让你知道它.
在C++(以及后来的C版本)中,您可以在函数中的任何位置创建变量,您应该创建它并同时初始化它.但这在早期是不可能的.你必须使用类似的东西:
int fn(void) {
int x, y;
/* Do some stuff to set y */
x = y + 2;
/* Do some more stuff */
}
Run Code Online (Sandbox Code Playgroud)
如今,我选择:
int fn(void) {
int y;
/* Do some stuff to set y */
int x = y + 2;
/* Do some more stuff */
}
Run Code Online (Sandbox Code Playgroud)
编程中最古老的借口:它提高了性能!
编辑:阅读您的评论,我同意 - 几年前,性能的重点是 CPU 周期数。我的第一个 C 编译器是传统的 C(在 ANSI C 之前的那个),它允许编译各种令人厌恶的东西。在现代,绩效与客户投诉的数量有关。当我告诉我们招聘的新毕业生时 - “我不在乎程序给出错误答案的速度有多快”。使用现代编译器和开发的所有工具,少写错误,每个人都可以按时回家。
也许在某些情况下,在需要之前保留内存未初始化会更快(例如,如果在使用变量之前从函数返回)。无论如何,我通常都会初始化所有内容,我怀疑这会对性能产生任何真正的影响。我确信编译器将有自己的方式来优化无用的初始化。