[英]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.