簡體   English   中英

復制原始類型行為的std :: vector

[英]Copying std::vector of primitive types behavior

背景:

使用其復制構造函數或復制賦值復制std::vector如下所示:

std::vector<T> v1{T(),T(),T()};
std::vector<T> v2 = v1;

發生深層復制。

是否可以通過標准保證為每個元素觸發T的復制構造函數? 換句話說,不會調用memcpy (或類似的東西)。 (如果我錯了,請糾正我)。

題:

另一方面,標准是否保證它會在原始類型上調用memcpy (或類似的東西)(針對性能問題)?

是的,必須調用T的復制構造函數。 如果復制構造函數是微不足道的,它的效果與memcpy的效果完全相同,因此使用后者實現該復制構造函數的實現很好。 從那時起,實現可能決定使用memcpy來實現vector的復制構造函數。 該決定使用as-if規則 :程序的可觀察行為保持不變,因此我們不需要實際執行所有復制構造函數調用。

另一方面,標准是否保證它會在原始類型上調用memcpy(或類似的東西)(針對性能問題)?

不,因為實際上如何實現復制構造函數是一個實現細節。 標准只是指定程序的(可觀察的)行為,它使用復制構造函數等的概念來實現。優化不是抽象的標准文檔應該擔心的,而是您的供應商。 實際上,限制這些函數的定義會導致優化中的巨大缺陷,或者由於前面提到的as-if規則而被完全忽略。

為原始類型的復制構造生成的確切代碼是實現質量問題。 換句話說,標准不保證任何類型 - 最多,它將指定操作的算法復雜性,在這種情況下,矢量的復制可以推斷為O(n)

使用現代C ++編譯器進行合理的優化設置,您可以依賴於在線實現的POD類的復制構造,與常量大小的memcpy一樣高效。 做其他事情會導致典型用例的嚴重處罰,例如指針的STL容器。

暫無
暫無

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

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