我需要将数组声明为静态局部变量吗?

时间:2019-01-24 16:21:18

标签: c++ arrays variables static allocation

比方说,我有一个函数很多,其中包含一个数组:

char foo[LENGTH];

根据LENGTH的值,每次调用函数时分配它可能会很昂贵。我看过:

static char foo[LENGTH];

因此只能分配一次,并且始终使用该数组:https://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables

这是数组的最佳实践吗?

编辑:

我已经看到一些回答,说静态本地不是最好的。但是初始化成本呢?如果我打电话给我怎么办?

char foo[LENGTH] = "lorem ipsum";

不是每次调用该函数都必须复制吗?

3 个答案:

答案 0 :(得分:2)

由于LENGTH应该是一个编译时间常数(C ++,没有C99 VLA),因此foo仅将使用堆栈上的空间。很快。

答案 1 :(得分:1)

首先,分配char的自动数组的时间不取决于其大小,并且任何明智的实现方式都是递增堆栈指针的恒定时间复杂度,这是超快的。请注意,即使对于VLA(在C ++中无效)也是如此,只是该增量将是运行时操作数。还请注意,如果初始化数组,答案将有所不同。

因此,目前尚不清楚您指的是什么性能缺陷。

另一方面,如果您创建上述数组static,则在所提供的示例中将不会造成任何损失-由于char尚未初始化,因此不会出现正常同步,这会阻止静态变量加倍初始化。但是,您的函数将(可能)变为线程不安全的。

最重要的是:过早的优化是邪恶的根源。

答案 2 :(得分:0)

“分配”原始数据类型并具有自动存储持续时间的对象通常没什么大不了的。问题是更多的:您是否希望foo的内容在函数的执行中幸存?

例如,考虑以下功能:

char* bar() {
   char foo[LENGTH];
   strcpy(foo, "Hello!");
   return foo;  // returning a pointer to a local variable; undefined behaviour if someone will use it.
}

在这种情况下,foo将超出范围,并且bar完成后将无法(合法)访问。

一切都很好,但是,如果您写

char* bar() {
   static char foo[LENGTH];
   strcpy(foo, "Hello!");
   return foo;  // foo has static storage duration and will be destroyed at the end of your program (not at the end of bar())
}

如果变量变大到超过(有限的)堆栈大小,或者您递归调用函数,则可能会出现具有自动存储持续时间的大变量的问题。但是,要解决此问题,您需要改用动态内存分配(即new / delete)。