全局变量0-initialized惩罚
Global variable 0-initialized penalty
这是一个非常简单的问题:
在运行时初始化全局变量和静态变量是否有任何性能损失(尽管非常小)?
不可以,因为c++(和C)标准规定所有未由程序员显式初始化的全局/静态变量必须初始化为零。这些变量被放置在一个叫做.bss
的特殊段中。它们在main()被调用之前被初始化为零。
如果你显式初始化你的global/static,但值为0,编译器足够聪明地意识到这一点,仍然把它放在bss
段。
你可以用下面的例子自己测试一下:
#include <stdio.h>
static int uninit;
static int init_zero=0;
static int init_one=1;
int main (void)
{
printf("%pn", &uninit);
printf("%pn", &init_zero);
printf("%pn", &init_one);
return 0;
}
在这个例子中,uninit
和init_zero
变量将在相邻的内存地址结束(可能彼此相距4字节),因为它们都在.bss
段中。但是init_one
变量将完全在其他地方结束,因为它是在.data
段中分配的。
将问题从0初始化(只是的子集)扩展到默认初始化,我们仍然可以得出结论,它通常对应用程序性能没有可衡量的影响。然而,很容易设计一个类,例如,在它的构造函数中进行数据库查找,从而在应用程序启动时产生有趣的效果。
相关文章:
- 如何解决"no Qt platform plugin could be initialized"问题?
- C++ 错误:"array must be initialized with a brace-enclosed initializer"
- 如果着色器中未使用绑定属性位置,是否会对其进行惩罚
- 为什么我会收到此警告? "Member 'x' was not initialized in this constructor"
- Visual Studio xtree _STL_VERIFY(this->_Getcont(), "cannot increment value-initialized map/set ite
- 这个指针和性能惩罚
- 在C 11中使用静态变量是否受到惩罚
- 这个"CRT not initialized"错误是怎么回事?
- c++11 lambda初始化的惩罚
- 如何修复错误" Variable-sized object may not be initialized "?
- 函数中的C ++-"a reference .. can not be initialized with a value"的错误
- 在类中包装int的任何性能惩罚
- 编译器错误:"Non-aggregates cannot be initialized with initializer list."
- 禁止从模板类的库标头中"Base class ‘class X’ should be explicitly initialized in the copy constructor"
- 如何使用 std::array 的默认参数? "array must be initialized with a brace-enclosed initializer"
- 在 CUDA 内核中使用字符变量是否会受到惩罚
- 可变长度数组中的运行时惩罚
- C++:基类构造函数中的"Field 'object_var' must be initialized"
- G++警告"will be initialized after",无论实际顺序如何
- 全局变量0-initialized惩罚