簡體   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