[英]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的默認構造函數,那么它將在堆中分配。
之所以這樣,是因為出於“性能”的原因,因為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.