C++ 不理解某些编程模式 当我阅读有经验的程序员代码时,我意识到一些模式,我不会考虑优化代码。我一直在谷歌上搜索这个话题,但是我找不到关于这个话题的讨论

C++ 不理解某些编程模式 当我阅读有经验的程序员代码时,我意识到一些模式,我不会考虑优化代码。我一直在谷歌上搜索这个话题,但是我找不到关于这个话题的讨论,c++,c,debugging,variables,optimization,C++,C,Debugging,Variables,Optimization,在程序开始时声明所有变量的原因是什么?例如,为什么有人使用: GtkWidget *window; gtk_init(NULL, NULL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 而不是 gtk_init(NULL, NULL); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 或者,例如,为什么要为循环声明变量i int i; char *a; (code)

在程序开始时声明所有变量的原因是什么?例如,为什么有人使用:

GtkWidget *window;

gtk_init(NULL, NULL);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
而不是

gtk_init(NULL, NULL);

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
或者,例如,为什么要为循环声明变量
i

int i;
char *a;

(code)

for(i = 0; i < n; i++)
我想它会更容易阅读。这不是在泄露记忆吗?因为在调用的
之前,内存中有4个字节未被使用

我不记得我在其他代码中看到的其他模式,但我经常发现这样的事情,我想知道为什么会这样;特别是如果它们没有优化(我猜)。我问过一些人为什么他们会这样做,但他们要么告诉我他们是这样教的,要么他们会生气,好像我不该问那个样

我真的很想知道程序员为什么这样构造代码,以便理解和改进我的编码。 如果您对如何构建代码有任何建议或关于良好编程行为的提示,请告诉我。

来自: 这样,编译器就知道调用什么变量以及它们是什么类型的变量(它们可以包含什么值)

我认为这篇文章是相关的:

这不是在泄露记忆吗?因为在调用for之前,内存中有4个字节未被使用

我不这么认为。在我工作过的常见平台Linux和Windows中,无论是在函数顶部声明变量还是在执行时声明变量,堆栈框架的大小都是相同的

在函数顶部声明变量会产生不利影响的唯一情况是,如果对象的构造成本很高


无论您是在函数顶部声明它们,还是根据需要声明它们,大多数情况下,开发团队中的策略决策。

在您描述的情况下,任何适当的优化编译器都会缩短
int
或指针的有效生存期,以实现缩短的生存期所带来的性能改进

<早期的声明是坏C++风格(和C版本的C版本中的坏C风格)。但对于这种糟糕的风格,您需要一个更难的示例来生成效率更低的代码

阅读代码的人没有编译器那么多的内存,因此任何声明生存期超过其有用生存期的变量都会使试图理解代码的人感到困惑。首先要担心这一点,而且(大多数情况下)让编译器编写人员担心性能。

较旧版本的C(K&R C,C89)要求在块中的任何代码之前声明所有变量。直到C99标准,声明才可以与代码混合(C++显然早一点这样做)。至于为什么会出现这种情况,请记住,C是20世纪70年代早期的产物,当时256千字的内存量很大,处理器速度比今天慢了几个数量级。任何简化解析和代码生成的方法都是一件好事,强迫您将声明分组在一起有助于这一点(请注意,许多C的同时代人,如Fortran和Pascal,也强迫所有声明在函数或块的开头出现)

至于内存,大多数编译器将生成代码,以便在函数项处为所有块作用域对象分配存储,而不管声明在源代码中实际出现在何处。瞧,这两个片段

int i;
// bunch of code here
for ( i = 0; i < 10; i++ ) 
  do_something_interesting();
inti;
//这里有一堆代码
对于(i=0;i<10;i++)
做些有趣的事;

//这里有一堆代码
对于(int i=0;i<10;i++)
做些有趣的事;
将(最有可能)导致在函数输入处为
i
分配空间的相同机器代码


延迟声明(无论如何,在C语言中)的唯一真正好处是使代码更易于阅读和维护。它对运行时性能几乎没有影响(编译器可能会根据声明的位置进行稍微不同的优化,但这不会发生太多)

请解释一下,这在每种语言中都是非常不同的。其中一个主要的区别。在块的开头声明变量可以极大地提高可读性。我用两种语言编写程序,所以我正在寻找来自两种背景的人的答案来应用到我的代码中。但是不是有人为了可读性而牺牲内存使用吗?我猜不出每个人的原因,但是一些旧语言实际上需要在函数块的开头声明所有变量。也许他们很久以前才学会编码。当然,这只是随机猜测。@CássioRenan是的,包括旧标准。这花费的唯一“内存”是保存源文件的磁盘空间。如果你担心这一点,那么就缩短变量名和函数名,去掉回车符、换行符和其他浪费的空格。虽然这可能会回答这个问题,但要在这里包括答案的基本部分,并提供链接供参考。我不认为这是一个答案,因为上面的引语暗示海报不理解这个问题。OP确实理解必须声明变量,但令人困惑的是为什么有经验的程序员在块或函数的顶部声明变量。谢谢你的建议!这实际上是我对stackoverflow的第一次回应,我不知道人们对他们的回答有什么期待。下次我会更加小心。为什么“早期声明”的风格不好?它们极大地提高了可读性。任何函数只要足够长,就可以有足够的变量或代码来耗尽内存
int i;
// bunch of code here
for ( i = 0; i < 10; i++ ) 
  do_something_interesting();
// bunch of code here
for ( int i = 0; i < 10; i++ ) 
  do_something_interesting();