2013-04-24 69 views
7

我已經看到兩者都用於相同的目的,但我不知道結果會有什麼不同(如果有的話)以及爲什麼這會被使用。元組和compress_pair有什麼區別?

對文檔的引用:compressed_pairtuple

+2

std :: pair是兩個元素的元組。元組可以是任意數量的元素(任何類型)。我可以想象compressed_pa​​ir上的文檔可以解釋其他任何內容。 (但是我認爲它會進行一些與存儲相關的優化) – GRAYgoose124 2013-04-24 18:10:52

+0

@ GRAYgoose124:就是那個_empty base optimization_。 – 2013-04-24 18:16:28

+0

那麼,即使對於兩個元素,是不是會提供必要的「壓縮」? – rubenvb 2013-04-24 18:17:22

回答

14

C++要求所有類型的大小都大於0.如果類型的的大小爲0,則數組索引和其他指針數學會出錯。

class EmptyClass { }; 

std::cout << sizeof(EmptyClass); // Prints "1" (typically) 

compressed_pair是優化不要求額外的存儲一種類型的,因爲0的尺寸是被禁止的僅具有一個尺寸爲1兩種元素的元組。

if (sizeof(compressed_pair<int,EmptyClass>) == sizeof(int)) 
{ 
    std::cout << "EmptyClass was compressed."; // (This will print) 
} 

這是通過Empty Base Optimization實現的。這兩種類型都放在一個類包裝器中,如果一個類型爲「空」,那麼該類將成爲另一個類型的父類型。

+0

爲什麼要採用'compressed_pa​​ir'類的大小。它不會返回一個可以通過':: [name_of_type]'訪問的類型嗎?... – 0x499602D2 2013-04-24 22:02:57

+0

@ 0x499602D2(除非我很困惑)它說明'EmptyClass'的存在不會增加' compressed_pa​​ir'作爲一個整體。 – 2013-04-24 22:14:29

+0

'compressed_pa​​ir'的大小如何與'int'的大小相同我基本上是想說。 – 0x499602D2 2013-04-24 22:16:18