2013-02-25 47 views
1

使用STL容器學習(&試驗)時,我發現我的系統(gcc版本4.7.2,x86_64)上的矢量max_size = 4611686018427387903和deque max_size = 2305843009213693951。從我的(有限)理解中,deques通常在內部實​​現爲向量列表(或向量向量?)。如果是這種情況,那麼爲什麼deque的max_size小於vector(矢量)實際上需要連續的內存塊並且deque可能能夠處理多個連續塊的矢量?這與我的系統配置,當前狀態有什麼關係,還是它的方式?爲什麼我得到deque的max_size()小於向量的max_size()?

回答

1

我錯過了您的問題中的一個細節:您測試max_sizes時使用了哪些類型? Ideone的gcc 4.7.2(在32位上)說both have the same max_size - 如果給定相同的元素類型。對於int,其2^30-1--這意味着存儲數據的最大大小爲(2^32 - 4)字節,因爲該系統上的sizeof(int) == 4

這是一個瘋狂的猜測在這裏:你有沒有比較vector<T>::max_sizedeque<U>::max_sizesizeof(T) == 4sizeof(U) == 8?這可以解釋近似因子2.

就是這樣,您的實驗顯示,max_size只返回一個非常理論的數字,因爲您肯定無法將2^62-1整數存入內存。 -1源於「第一個」4個字節必須留空的事實,否則就是&vec[0] == NULL。該程序中的任何其他數據都不會存儲在向量中的整數 - 包括向量本身!

+0

哦。神奇的分析。我的錯誤:(你是對的,我無意中使用了不同的數據類型進行比較,我應該自己做更多的分析,但是我錯過了這個微不足道的事情,因爲它是一個非常長的程序。謝謝 – lucent 2013-02-25 15:34:01

0

正如你可能已經注意到,4611686018427387903是2^62 - 1和2305843009213693951是2^61 - 1,它應該給你一個提示這些數字來自何處(提示:與你的系統配置無關)。

我不知道真正的原因,但我猜測這是非常學術的,並且與向量或者deques是如何實現無關的。也許海灣合作委員會的德克使用額外的一點來跟蹤別的東西。有人熟悉海灣合作委員會可能可以在這裏掛鐘。無論如何,語言標準沒有說明什麼是max_size應該是什麼,所以它完全取決於庫/編譯器實現者。

這些數字非常大,在練習中,您會在接近max_size之前看到其他事情。也許有些古怪的STL實現,其中max_size非常小,但至少對於GCC你不需要擔心它。

+0

提示64位系統的答案是? :)。無論如何,我不打算用這麼多的數據填充它,但想知道這種反直覺行爲(如果是的話)的真實和確切的原因可能是我不知道或不明白。 – lucent 2013-02-25 06:16:41

相關問題