【发布时间】:2017-12-14 09:51:00
【问题描述】:
我想知道如果我想在函数中使用由 n 个 unsigned char 元素组成的零初始化数组,最好的方法是什么。 n 约为。 600.
a) 在每次函数调用时重新声明数组:
unsigned char buffer[n] = {0};
b) 声明为静态但 memset 每个函数调用:
static unsigned char buffer[n] = {0};
memset (buffer, 0, n);
我希望 (a) 中的 memset 和初始化成本相同。但是对于(a)我需要为每个函数调用分配内存并在我离开函数时释放它。这在 (b) 中不会发生,因为数组被声明为静态的。 我对吗?
【问题讨论】:
-
考虑到所有现代编译器都将局部变量放在堆栈上,包括数组,“分配”这样的内存只是编译器适当地调整堆栈和帧指针寄存器。 无论如何都必须这样做。没有“真正的”分配(比如调用
malloc或类似的)。 -
我预计 [性能] 不会有任何差异。分配和初始化一个 600 的自动数组可能会让编译器也插入一个
memset调用来初始化它(或者它可以插入机器指令)。 -
使用静态数组的方法的缺点是它不是线程安全的。甚至递归也不可能。因此,如果您没有为最后一微秒而战,请使用另一种方法。如果您正在战斗,请测试一下。
-
@StoryTeller 好吧,更好的说法是称它为不可重入。这总是非常危险的。我有一个情况(很久以前)我在信号处理程序中做了一个 printf() 。它时不时地崩溃,因为有时在 malloc() 调用期间调用了信号处理程序(在这种情况下调试器无济于事)。所以我了解到,使函数可重入是一组好主意的成员
-
@Ronald - 我会进一步说它是该系列的杰出成员。