【问题标题】:c function: re-initialize a static array or declare new every call?c函数:重新初始化一个静态数组还是每次调用都声明一个新的?
【发布时间】: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 - 我会进一步说它是该系列的杰出成员。

标签: c arrays static


【解决方案1】:

保持static 意味着它在启动时被初始化为零,这对你没有好处,因为无论如何你在运行时将它设置为零。如果系统特定的静态初始化是在运行时执行的,这意味着您的程序启动速度会变慢。

另外,static 变量不是线程安全的,这可能是也可能不是问题。

在堆栈分配情况下需要时间的不是分配,而是归零。因此,如果您关心性能,最好的解决方案是根本不对其进行零初始化,而是确保算法写入数组的每个字节。我不知道这里的算法,但是“我必须有一个大小为 600 的全零本地数组”是一个奇怪的要求。

【讨论】:

  • 好的方面。该数组用于存储我通过 UDP 接收的数据。数据长度可以在 13 到 525 个字符之间变化。 600只是告诉一个数字。如果我理解正确,以下似乎是一种更好的方法:通过 UDP 数据接收并将其直接写入数组。然后将剩余的字节清零。我会试试这个。感谢您的启发
  • @Stefatronik 或者只使用一个大小变量来跟踪实际使用了多少数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2011-10-26
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多