[M1 Mac, Big Sur 11.6.7]
関数内外の変数がメモリのどの領域に収納されるのか検証しました。
関数外変数は静的領域、関数内変数は全てスタック領域でした。最終的にはOSが決めているようです。
newやvectorは一般的にはヒープ領域と説明されているので意外な結果でした。
vectorの最大要素数は4611686018427387903個です。int は4バイトなので
4611686018427387903*4 = 1.8446744e+19バイト = 1.8446744e+19*8 ビット
これは64ビットシステム 2^64 – 1の8倍に相当します。この出力値はIntel Mac RAM32GB(M1は8GB)でも同じだったのでメモリ容量に比例しているわけでもないです。
つまり実際のハードスペックを考慮しての実装上可能値ではなく、スタックオーバーフロー対策の参考にはなりません。机上の計算を再現するだけのmax_size関数が何のために存在しているのかよく分かりません。
#include <iostream>
#include <vector>
int num0;
int main()
{
int num1;
int num2 = 3;
int *ary;
ary = new int[5];
std::vector<int> vec = {1,2,3};
std::cout << "num0 " << &num0 << std::endl;
std::cout << "num1 " << &num1 << std::endl;
std::cout << "num2 " << &num2 << std::endl;
std::cout << "ary " << &ary << std::endl;
std::cout << "vec " << &vec << std::endl;
std::cout << "vec.max_size() " << vec.max_size() << std::endl;
}
--------------------------------------------------
出力例
--------------------------------------------------
num0 0x1048e4128
num1 0x16b5236a8
num2 0x16b5236a4
ary 0x16b523698
vec 0x16b523680
vec.max_size() 4611686018427387903