这个声明的意义取决于你如何标点它:
读法1:
静态数据的优点是可以在程序启动之前初始化为期望的值。缺点是内存空间会在整个程序执行期间被占用,即使变量只在程序的一小部分中使用也是如此。所有这些都会使数据缓存效率降低。
这是无意义的。
读法2:
静态数据的优点是可以在程序启动之前初始化为期望的值。
缺点是内存空间会在整个程序执行期间被占用,即使变量只在程序的一小部分中使用也是如此。如果静态变量的存储已分配到不经常交换的页面或很少使用的高速缓存线中,则可能会导致数据缓存效率降低。
在特定情况下,答案是"取决于情况"。
是的,static_arr的初始化是一个仅需操作,因此可以认为是无成本的。
是的,local_arr的初始化在每次调用函数时都会发生,但这可能是以下两种情况之一:
这种初始化是微不足道的;或者
初始化被编译器省略为优化器的一部分
通常情况下,除非您有特定的优化目标,否则最好编写明确说明所需行为的代码,例如:
当变量/数组的值需要在函数的连续调用中保留时,使用静态变量(具有静态存储期的变量)。
当现有值在函数进入或退出时毫无意义时,使用局部变量(严格来说是自动存储期的变量)。
您会发现编译器在几乎所有情况下都会在优化通过之后执行最有效的操作。
特定情况下,静态初始化更好。例如,缓冲区需要动态分配的情况。您可能不想在每次调用时都承担分配/释放成本。您可能希望缓冲区在需要时动态增长,并基于未来操作可能再次需要内存的基础上保持增长。
在这种情况下,变量的实际状态是其分配缓冲区的大小。因此,在函数的进入和退出时,状态很重要,例如:
std::string const& to_string(json const& json_object)
{
static thread_local buffer;
buffer.clear();
serialise_to_string(buffer, json_object);
return buffer;
}