比方说,我有一个函数很多,其中包含一个数组:
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";
不是每次调用该函数都必须复制吗?
答案 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)。