什么更有效?
声明数组,例如char缓冲区[4096]在循环之前和每次迭代中通过strlcpy清除其内容或在循环内使用初始“”值声明数组?
char buffer[4096] = "";
while(sth)
{
strlcpy(buffer,"",sizeof(buffer));
//some action;
}
VS
while(sth)
{
char buffer[4096] = "";
//some action;
}
答案 0 :(得分:3)
两者之间可能没有显着差异。唯一可以确定的方法是基准测试或查看编译器生成的程序集。
第二个例子更清晰,更受欢迎。
答案 1 :(得分:3)
如果它只是用作字符串缓冲区,则没有理由清除整个缓冲区。您需要做的就是确保将NUL字节\0
附加到相关字符串的末尾。
如果你想保证str *函数从buffer
的开头开始,那么上面提到的原因只需要一个简单的*buffer = '\0'
。
答案 2 :(得分:1)
唯一可能的性能差异是对缓冲区的赋值,这可能会由编译器转换为与此相同的单个语句:
*buffer = 0;
进入循环时,编译器不会执行任何堆栈管理。无论是在循环内部还是外部定义缓冲区,都不会对堆栈产生任何影响。缓冲区的位置将在例程开始时保留在堆栈中,无论您在何处定义缓冲区变量(这并不意味着编译器将允许您访问定义它的范围之外的缓冲区)。 p>
如果上面显示的单个赋值可能会被编译器优化,如果它发现每次反复重新初始化缓冲区都没有意义。
答案 3 :(得分:0)
注重可读性。在需要时进行优化。
答案 4 :(得分:0)
我建议使用第一个版本。在第一个版本中,数组仅分配一次。在第二个版本中,数组在循环的每次迭代中分配。
虽然编译器可以优化分配(例如只执行一次),但我相信将其分解出来会向读者表明内存只分配一次。
这可能没有什么可担心的,因为许多平台在堆栈上分配并且分配包括更改堆栈指针的内容。
当有疑问时。
在考虑优化时,请不要。花时间使程序正确和健壮。