簡體   English   中英

向量和原始類型初始化

[英]vector and primitive type initialisation

我了解到,如果您在全局范圍內聲明一個int,

int x; //默認為0;

在當地范圍內

void f() {
    int x; //undefined
}

但是,如果我們在全局或局部范圍內使用向量:

vector <int> v(3); //使用int的默認構造函數將v初始化為{0,0,0}。

通過執行以下操作,我們可以在本地范圍內默認初始化int,例如vector的元素:

int x = int(); //默認為0

我認為,如果我們使用int的默認構造函數,那么它將在堆中分配。

  1. 為什么不能在Tx;之類的本地范圍內默認初始化原始類型? 要么
  2. 在本地范圍內,為什么矢量(其他容器不知道)使用元素的默認構造函數,而不像int聲明那樣不對它們進行未初始化?
  3. 當前的方法對這兩種類型有什么好處? 為什么用不同的方式初始化它們? 這是關於性能的嗎?

之所以這樣,是因為出於“性能”的原因,因為C ++人士希望C人士早在1980年代就沒有任何理由抱怨“為我們不需要的東西付錢”。 這是C ++的宗旨之一,它不為不使用的東西支付(運行時)費用。 因此,盡管具有構造函數的類和結構始終具有被調用的那些構造函數,但是默認情況下,老式POD類型是未初始化的。

如果我今天指定它,我會說int x; 在本地范圍內將被默認初始化(為0),如果您想避免這種情況,可以說int x = std::noinit; 現在這還為時已晚,但是當性能非常重要時,我實際上已經在某些類類型中完成了它:

class SuperFast
{
  struct no_init_t {};
public:
  no_init_t no_init;
  SuperFast() : x(0), y(0) {}
  SuperFast(no_init_t) {}

private:
  int x, y;
};

這樣,默認構造將提供有效的對象,但是如果您有嚴重的理由需要避免這種情況,則可以這樣做。 如果您知道很快就會覆蓋全部這些對象,則可以使用此技術-無需默認構造它們:

SuperFast sf(SuperFast::no_init); // look ma, I saved two nanoseconds!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM