使用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()?
回答
我錯過了您的問題中的一個細節:您測試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_size
與deque<U>::max_size
與sizeof(T) == 4
和sizeof(U) == 8
?這可以解釋近似因子2.
就是這樣,您的實驗顯示,max_size只返回一個非常理論的數字,因爲您肯定無法將2^62-1
整數存入內存。 -1源於「第一個」4個字節必須留空的事實,否則就是&vec[0] == NULL
。該程序中的任何其他數據都不會存儲在向量中的整數 - 包括向量本身!
正如你可能已經注意到,4611686018427387903是2^62 - 1
和2305843009213693951是2^61 - 1
,它應該給你一個提示這些數字來自何處(提示:與你的系統配置無關)。
我不知道真正的原因,但我猜測這是非常學術的,並且與向量或者deques是如何實現無關的。也許海灣合作委員會的德克使用額外的一點來跟蹤別的東西。有人熟悉海灣合作委員會可能可以在這裏掛鐘。無論如何,語言標準沒有說明什麼是max_size
應該是什麼,所以它完全取決於庫/編譯器實現者。
這些數字非常大,在練習中,您會在接近max_size
之前看到其他事情。也許有些古怪的STL實現,其中max_size
非常小,但至少對於GCC你不需要擔心它。
提示64位系統的答案是? :)。無論如何,我不打算用這麼多的數據填充它,但想知道這種反直覺行爲(如果是的話)的真實和確切的原因可能是我不知道或不明白。 – lucent 2013-02-25 06:16:41
- 1. 限制stl的向量max_size
- 2. 將deque max_size設置爲最大尺寸
- 3. 爲什麼不是std :: string :: max_size()== std :: string :: allocator :: max_size()
- 4. 列表MAX_SIZE實施
- 5. 尺寸大於容器中的max_size
- 6. Codeigniter :: alert用javascript通知max_size
- 7. Yii2 MAX_SIZE驗證問題
- 8. 爲什麼會std :: vector max_size()函數返回-1?
- 9. 初始化後的Boost日誌集max_size
- 10. 在php中上傳表格max_size
- 11. 爲什麼一個deque的大小會少於一個小數?
- 12. 管理電子郵件附件時,理論上的MAX_SIZE理論是什麼?
- 13. 無效的deque <T>下標。爲什麼我得到這個錯誤?
- 14. 爲什麼我的向量大小爲0?
- 15. setMaxResults(max_size)拋出Sql命令沒有正常結束異常
- 16. 我不明白爲什麼我得到這個有關向量的錯誤
- 17. 爲什麼std :: deque不是在索引0之前保留內存的向量?
- 18. 爲什麼我得到一個ArrayIndexOutOfBoundsException對於我的ArrayList
- 19. 爲什麼我得到空
- 20. 爲什麼我得到.UnauthorizedAccessException?
- 21. 爲什麼我得到IllegalFormatConversionException?
- 22. 爲什麼我得到System.IndexOutOfRangeException:EmpPassword
- 23. 爲什麼我得到linebreaks?
- 24. 爲什麼我得到flask.redirect
- 25. 爲什麼我得到零
- 26. 爲什麼我得到java.lang.ClassNotFoundException?
- 27. 爲什麼我得到System.Data.DataRow?
- 28. 爲什麼我得到java.security.AccessControlException?
- 29. 爲什麼我得到502
- 30. 爲什麼我得到InvalidOperationException?
哦。神奇的分析。我的錯誤:(你是對的,我無意中使用了不同的數據類型進行比較,我應該自己做更多的分析,但是我錯過了這個微不足道的事情,因爲它是一個非常長的程序。謝謝 – lucent 2013-02-25 15:34:01