C变量初始化开销

C变量初始化开销,c,C,考虑以下代码: int i=0;//initialize here for (i=0;i<10;i++) { //... do something here } inti=0//在这里初始化 对于(i=0;i编译器通常能够对这样一个简单的案例进行简短的处理。最好的方法是将int i=0放入for循环中。如果需要在循环后使用i,那么就先初始化它,然后将for循环的init部分留空。编译器通常能够对这样一个简单的案例进行简短的处理。最好的方法是将int i=0放在for循环内。如果需

考虑以下代码:

int i=0;//initialize here
for (i=0;i<10;i++) {
    //... do something here
}
inti=0//在这里初始化

对于(i=0;i编译器通常能够对这样一个简单的案例进行简短的处理。最好的方法是将int i=0放入for循环中。如果需要在循环后使用i,那么就先初始化它,然后将for循环的init部分留空。

编译器通常能够对这样一个简单的案例进行简短的处理。最好的方法是将int i=0放在for循环内。如果需要在循环后使用i,则先初始化它,并将for循环的init部分留空。

编译器不会动态分配自动变量。可以说,没有“init”。因此,移动变量声明没有真正的目的除了防止作用域问题之外。

编译器不会动态分配自动变量。可以说,没有“init”。因此,除了防止作用域问题之外,移动变量声明没有任何真正的目的。

要验证要生成的汇编语言的开销。 你可以通过

gcc-c-O0-S

您需要使用
-c
标志,它将生成一个名为
yourcode.s
的文件

重命名每个汇编语言.s文件,然后使用每个编译器选项重新执行gcc命令以进行优化,-O1,-O2,-O3

从这些汇编语言文件中,您可以准确地确定开销是多少,以及它是否重要

int main ( int argc, char *argv[] )
{
   int i;
   int j;

   i=5543644;    /* to have or not to have this line*/
   for ( i = 0; i < 2342465; i++ )
      j = i;

   return 0;
}
这是将数据值5543644复制到i的内存地址中。我使用了一个非零的值,以便在汇编语言中显示它

当使用编译器优化时,-O3,生成的两个汇编语言文件是相同的。这证明了优化会导致编译器在
for
循环之前直接识别出
i=5543644;
是无用的,并且在执行时会发现生成的
movl
行>-未生成O0

这是使用gcc 4.3.4进行测试的

从您的简单代码示例just
int i=0;
中,不需要这样做就知道没有实际的开销,但是由于代码变得非常大和复杂,如果无用的
i=5543644;
不是直接在for循环之前,那么它可能不会得到优化。源代码和汇编语言必须是scruti我决定做出这个决定


如果这种类型的数据分配确实发生了,例如在嵌套for循环和OPENMP或其他并行化指令中,导致这种情况发生数百万次或数十亿次,具体取决于代码,那么是的,它将导致开销。这可能是非常主观的。要验证要生成的开销,请ong>汇编语言。 你可以通过

gcc-c-O0-S

您需要使用
-c
标志,它将生成一个名为
yourcode.s
的文件

重命名每个汇编语言.s文件,然后使用每个编译器选项重新执行gcc命令以进行优化,-O1,-O2,-O3

从这些汇编语言文件中,您可以准确地确定开销是多少,以及它是否重要

int main ( int argc, char *argv[] )
{
   int i;
   int j;

   i=5543644;    /* to have or not to have this line*/
   for ( i = 0; i < 2342465; i++ )
      j = i;

   return 0;
}
这是将数据值5543644复制到i的内存地址中。我使用了一个非零的值,以便在汇编语言中显示它

当使用编译器优化时,-O3,生成的两个汇编语言文件是相同的。这证明了优化会导致编译器在
for
循环之前直接识别出
i=5543644;
是无用的,并且在执行时会发现生成的
movl
行>-未生成O0

这是使用gcc 4.3.4进行测试的

从您的简单代码示例just
int i=0;
中,不需要这样做就知道没有实际的开销,但是由于代码变得非常大和复杂,如果无用的
i=5543644;
不是直接在for循环之前,那么它可能不会得到优化。源代码和汇编语言必须是scruti我决定做出这个决定


如果这种类型的数据分配确实发生了,例如在嵌套for循环内和OPENMP或其他并行化指令内,导致这种情况发生数百万或数十亿次,具体取决于代码,那么是的,它将导致开销。这可能是非常主观的。

这种“优化”不会对现代编译器产生任何影响。您可以在目标平台上轻松验证这一点如果有关系的话。如果这样的事情很重要,那么世界上的代码会非常慢。你的编译器的优化器会处理这个问题。更好的是,在for-loop中声明变量。这取决于代码得到优化的程度。如果启用了优化,任何最新的编译器都会对它进行优化,并且不会对它产生太大影响不管怎样,性能。理论上,没有任何编译器优化,并且使用哑的直接编译器,初始值设定项值必须是二进制文件的一部分,与执行实际赋值的启动代码一起影响其大小。应该注意的是,使用静态存储类的未初始化变量在某种程度上会溢出因为它们必须由启动代码重置为零。不久前,在
-O65535
普及之前,有一些“本机编译器”不进行任何优化(这样做的称为“优化编译器”).在那个时候,这种调整是有用的。但现在情况不同了,因为只有少数优化编译器幸存下来。这种“优化”是不可能的