簡體   English   中英

是否保證 std::vector 默認構造不會調用 new?

[英]Is it guaranteed that std::vector default construction does not call new?

根據參考一個簡單的std::vector<T> vec; 創建一個空容器(默認構造函數)。 這是否保證沒有動態內存分配? 或者一個實現可能選擇保留一些內存?

我知道,對於這個空構造函數,從 C++11 開始就沒有類型T構造。 但是,我想知道,是否也可以保證在堆上不分配任何內容。 即上面的行只是堆棧/成員上的幾個nullptr

我用 vc140 對其進行了測試,它確實沒有動態分配。

這是否保證沒有動態內存分配?

不。然而,實現不分配內存是很典型的。 我還沒有看到一個標准庫實現。

或者一個實現可能選擇保留一些內存?

可能,但這是不典型的。

我知道,對於這個空構造函數,從 C++11 開始就沒有類型T構造

也是在 C++11 之前。

std 庫是 C++ 語言的一部分。

幾乎任何對任何標准庫類或函數的調用都可能做病態和瘋狂的事情。 但對於int x=7;也是如此int x=7; -- 編寫該標准並不是為了防御坦率的敵對 C++ 實現,其中包括 std 庫。

話雖如此,std 向量的零參數構造函數是 noexcept。 這意味着它不打算分配。 惡意實現可以自由分配、捕獲任何錯誤並繼續進行,無論分配是否成功。 惡意實現也可以自由地數到 47 萬億,對隨機數據運行一些 FFT,啟動神經網絡並針對莎士比亞進行訓練,編寫一些十四行詩,然后就好像什么也沒發生一樣繼續。 標准對C++中任何操作的不可觀察的詩歌成分沒有任何說明; 只要動作沒有可觀察的(在抽象機器內)副作用,標准就沒有意見。

在實踐中, std::vector<T>()沒有理由分配,並且沒有后續操作可以假設它已分配。 我可以看到一個檢測構建分配一些生命周期跟蹤令牌來強制執行迭代器失效錯誤,但這只能在帶有額外標志(例如-DCMP_JUN17 )的調試中啟用。

與其對新事物的呼喚,更擔心詩歌。

沒有保證。

如果_ITERATOR_DEBUG_LEVEL > 0,我剛剛遇到的一個反例(並引導我閱讀了這篇文章)是 MSVC2017 的 STL 實現。

暫無
暫無

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

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