繁体   English   中英

为什么C ++中的数组内容有时未初始化?

[英]why the contents of the array in c++ sometimes is not initialized?

我正在阅读有效的c ++书,其中有几页说:

如果您使用的是C ++的C部分,并且初始化可能会导致运行时开销,则不能保证会发生这种情况。 如果您进入C ++的非C部分,有时情况会发生变化。 这就解释了为什么不一定要保证数组(来自C ++的C部分)初始化其内容,而是保证矢量(来自C ++的STL部分)是初始化的。

我想知道为什么不能保证c + +的c部分数组是初始化的,但是向量是可以初始化的? c部分的数组不是内置类型吗? 但是为什么向量(来自C ++的STL部分)保证被初始化?

因为这就是标准所说的。 在C ++规范的早期,就决定更改C中定义的类型的工作方式。 因此,仅在以下情况下初始化数组( T[] ):1)类型T具有构造函数,2)有显式初始化,或者3)具有静态生存期。 由于std::vector不是从C继承的,因此没有C的先例可以关注。 并且由于您可以对向量执行的某些操作需要复制,因此必须将其初始化。 复制未初始化的值是未定义的行为。

请注意,在C ++ 11中, std::array遵循C规则。 (这样做是为了允许聚合初始化。)

当您定义int a[10]; (非静态), 则不初始化 a的内容。 这就是C和C ++的设计方式。 您没有要求,您没有得到。 (如果您想要一个初始化的数组,您可能会说int a[10]();

在C ++中,无论您做什么,类std::vector<int>被设计为始终具有定义明确的语义。 因此,当您定义std::vector<int> v(10) ,您将获得十个值初始化 (即归零)的元素(类似于上面的第二个示例)。

但是,不管用什么都不用付钱,无论如何,后者可能是较差的C ++。 通常使用的是reserve ,它像C语言一样创建内存,但没有对象,并且在需要时创建对象,不需要进一步分配:

std::vector<int> v;            // no allocation (hopefully)
v.reserve(10);                 // one single allocation

for (int i = 0; i != 10; ++i)
    v.push_back(i);            // no allocations, guaranteed

简而言之:C只知道内存 C ++将存储对象的概念分开。 此更细粒度的模型带有更丰富的界面。 在C语言中,您根本无法表达“我可能需要此存储空间,但是我还没有任何内容”的概念。

vector这样的C ++类型实际上是类,它们具有内置的构造函数-当我们创建此类变量时,该过程会自动调用,并且STL容器的构造函数可以初始化该变量。 而且,当您使用来自C的东西时,它要简单得多:从广义上讲,创建变量时所做的一切只是占用一部分内存以满足您自己的需求。 如果该内存中有东西,它将留在那里,仅因为创建此类型的变量(如简单数组)仅包括为其找到内存。

区别在于C样式数组是语言的原始语言,非常类似于int或float,因此这些规则基本上在声明时不执行任何操作。

int i;

在这里,我将采用内存中此位置之前的任何值。

但是向量(和其他STL容器)是对象,并且对象具有构造函数,通常可以完成一些工作。

std::vector<int> v1(10); //create a vector of 10 ints, not initialized, just like int[10] would do
std::vector<int> v2(10, 0);//create a vector of 10 ints, all initialized to zero.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM