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&
的值,其中alloc是vector&
先不管實際分配這麼多會不會oom,vector的grow函數內部有檢查代碼,當你嘗試擴展到大於上面那個值的元素,首先那個檢查代碼就過不去然後拋異常,根本輪不到new不到東西拋bad_alloc
其他人一幫強答的
更新一下,各編譯器(當前最新)的 max_size 實現.
libcxx:
return _VSTD::min&
numeric_limits&
libstdc++:
return _Alloc_traits::max_size(_M_get_Tp_allocator());
msvc:
return (_Min_value(static_cast&
_Alty_traits::max_size(this-&>_Getal())));
allocator_traits 的 max_size 基本都是這樣:
return (static_cast&
或者:
return numeric_limits&
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會報錯?