標籤:

g++中數組和vector元素個數最多只能是2^31 -1個嗎?

vector& memo(INT_MAX + 1, 0);

int memo[INT_MAX + 1];

以上兩種寫法編譯時都告警如下,且執行時報std::bad_alloc

warning: integer overflow in expression [-Woverflow]


理論最大值是表達式

std::allocator_traits&::allocator_type&>::max_size(alloc);

的值,其中alloc是vector&使用的分配器對象

先不管實際分配這麼多會不會oom,vector的grow函數內部有檢查代碼,當你嘗試擴展到大於上面那個值的元素,首先那個檢查代碼就過不去然後拋異常,根本輪不到new不到東西拋bad_alloc

其他人一幫強答的


更新一下,各編譯器(當前最新)的 max_size 實現.

libcxx:

return _VSTD::min&(__alloc_traits::max_size(this-&>__alloc()),
numeric_limits&::max());

libstdc++:

return _Alloc_traits::max_size(_M_get_Tp_allocator());

msvc:

return (_Min_value(static_cast&((numeric_limits&::max)()),
_Alty_traits::max_size(this-&>_Getal())));

allocator_traits 的 max_size 基本都是這樣:

return (static_cast&(-1) / sizeof(value_type));

或者:

return numeric_limits&::max() / sizeof(value_type);


INT_MAX+1這個表達式已經是overflow了。。。嚴格來說這是一個undefined behavior


拋 bad_alloc 是因為系統就算算上虛擬內存給你也不夠了。 linux 里能malloc 的最大值不能超過實際物理內存+配置的swap 大小


推薦閱讀:

子類所繼承的兩個父類有同名純虛函數,怎麼辦?
為什麼GCC5.x.x版本中的std::string不再採用寫時複製的實現,而改用了SSO的實現?
如何用 C/C++ 求 1 到 1000 內的所有完全數?
reinterpret_cast把const string*轉換成const char*出錯?
為什麼用了using namespace std會報錯?

TAG:C | CC | CPrimer | C11 |