2014-11-05 27 views
9

问:
为什么内置类型定义一个函数体的未初始化的对象有明确的值,而对象的内置式定义任何功能都被初始化为0''为什么在函数体内定义的未初始化的内置类型的对象有未定义的值?

拿这个例子:

#include <iostream> 
using std::cout; using std::endl; 

int ia[10];     /* ia has global scope */ 

int main() 
{ 
    int ia2[10];    /* ia2 has block scope */ 

    for (const auto& i : ia) 
     cout << i << " ";  /* Result: 0 0 0 0 0 0 0 0 0 0 */ 

    cout << endl; 
    for (const auto& i : ia2) 
     cout << i << " ";  /* Result: 1972896424 2686716 1972303058 8 
           1972310414 1972310370 1076588592 0 0 0 */ 
    return 0; 
} 
+8

考虑每次调用函数时初始化全局变量与初始化局部变量的开销。 – Angew 2014-11-05 13:27:42

+7

这显然是**不是重复**(至少不是链接的问题)。如果*全局内存被初始化,OP不会问* *为什么*,以及为什么局部变量是*不是*,这两个都没有在链接问题中得到回答。 – leemes 2014-11-05 13:46:21

回答

16

由于C++的一般规则之一是,你不支付你不使用的东西。

初始化全局对象相对便宜,因为它在程序启动时只发生一次。初始化局部变量会增加每个函数调用的开销,这不是每个人都想要的。所以决定让本地人的初始化是可选的,就像在C语言中一样。

BTW如果你想初始化函数内部数组,你可以这样写:

int ia2[10] = {0}; 

或C++ 11:

int ia2[10]{}; 
+0

您可能想提到堆栈(自动存储的常见实现),以及撤回时的状态,您可以将其保留在随机状态,并且当您使用上述规则增长时,您不必清除它。 – Yakk 2014-11-05 14:31:23

1

好回答你的问题可以发现这里http://www.cplusplus.com/doc/tutorial/arrays/

基本上,如果变量被定义在范围之外,它将默认为零初始化。

静态数组,以及直接声明在名称空间中(在任何 函数之外)声明的数组,始终被初始化。如果未指定明确的初始化程序 ,则所有元素都默认初始化(对于 基本类型,其值为零)。

这与在范围内定义的非0定义的变量进行比较。

缺省情况下,本地范围规则阵列(例如,那些声明的函数内 )被留下未初始化。这意味着它的任何一个 元素都不会被设置为任何特定值;他们的内容是 未确定的数组声明。

上面的链接实际上很好地解释了它,我没有任何隶属于他们。

+0

我对你在寻找什么的误解表示歉意。除了函数之外,在全局范围内,C++给它一个静态存储持续时间。在函数内部或在本地范围内,它具有自动存储持续时间。 http://en.cppreference.com/w/cpp/language/storage_duration – williamscodes 2014-11-05 14:25:56

2

函数外定义的变量在全局范围内。全局变量存储在可执行文件的数据段的BSS部分。在程序启动时默认初始化为零,并且只执行一次。

另一方面,函数中定义的变量存储在堆栈中,每次将其初始化为零将是一个相对昂贵的操作。

看一个节目的这个链接,内存布局:Memory Layout 1

看看这个链接,以及良好的解释: Memory Layout 2
从上面的链接

全球,对外报价,和静态变量默认初始化为零。

+0

不完全正确。具有静态持续时间的初始化变量(例如'int somedata = 42;')将位于.data段中,并在编译/链接时初始化,因为.data段仅被映射到内存中。 – 2015-04-30 20:55:11

相关问题