在循环之前或之内声明数组

时间:2011-02-24 21:41:00

标签: c memory-management

什么更有效?

声明数组,例如char缓冲区[4096]在循环之前和每次迭代中通过strlcpy清除其内容或在循环内使用初始“​​”值声明数组?

char buffer[4096] = "";
while(sth)
{
   strlcpy(buffer,"",sizeof(buffer));
   //some action;
}

VS

while(sth)
{
   char buffer[4096] = "";
  //some action;
}

5 个答案:

答案 0 :(得分:3)

两者之间可能没有显着差异。唯一可以确定的方法是基准测试或查看编译器生成的程序集。

第二个例子更清晰,更受欢迎。

答案 1 :(得分:3)

如果它只是用作字符串缓冲区,则没有理由清除整个缓冲区。您需要做的就是确保将NUL字节\0附加到相关字符串的末尾。

如果你想保证str *函数从buffer的开头开始,那么上面提到的原因只需要一个简单的*buffer = '\0'

答案 2 :(得分:1)

唯一可能的性能差异是对缓冲区的赋值,这可能会由编译器转换为与此相同的单个语句:

*buffer = 0;

进入循环时,编译器不会执行任何堆栈管理。无论是在循环内部还是外部定义缓冲区,都不会对堆栈产生任何影响。缓冲区的位置将在例程开始时保留在堆栈中,无论您在何处定义缓冲区变量(这并不意味着编译器将允许您访问定义它的范围之外的缓冲区)。 p>

如果上面显示的单个赋值可能会被编译器优化,如果它发现每次反复重新初始化缓冲区都没有意义。

答案 3 :(得分:0)

答案 4 :(得分:0)

我建议使用第一个版本。在第一个版本中,数组仅分配一次。在第二个版本中,数组在循环的每次迭代中分配。

虽然编译器可以优化分配(例如只执行一次),但我相信将其分解出来会向读者表明内存只分配一次。

这可能没有什么可担心的,因为许多平台在堆栈上分配并且分配包括更改堆栈指针的内容。

当有疑问时。

在考虑优化时,请不要。花时间使程序正确和健壮。