Samotný vector (nějaké 3 ukazatele) je přímo tam, kam ho dáte. Pokud bude lokální proměnná ve funkci, tak bude na stacku. Pokud bude jako členská proměnná nějaké třídy, tak bude tam co instance té třídy. Ten objekt vlastně to kde je nemusí vůbec řešit. (statické vázání jako pojem slyším poprvé, popravdě mi to spíš evokovalo keyword static, který je úplně něco jiného)
Pro svoje data si vector alokuje kus dynamické paměti na heapu. Ta bude na heapu vždycky, bez ohledu na to kde je ten samotný vector. Tu paměť si spravuje ve vlastní režii a programátora zajímá jen to, že přidávání do vectoru může způsobit realokaci. Paměť pro data si musí alokovat dynamicky, protože je její velikost neznámá.
Ten vector samotný nemá smysl samostatně dynamicky alokovat na haldě. Ve chvíli kdy je jako lokální proměnná nebo member, tak má jasně určené odkdy dokdy existuje, automaticky se na konci jeho života vyvolá destruktor a uvolní paměť.
Ten shared_ptr to má stejně. Samotný je na stacku nebo tam co objekt jehož je členem. A odkazuje se na paměť na haldě.
Já osobně paměť prohlížím v debuggeru. Čtení z libovolné adresy mi přijde zbytečné, ale z nějakého objektu se dají byty vykopírovat pomocí memcpy do pole surových charů.
A pro zjišťování velíkostí a rozložení struktur používám :
int a[sizeof(Neco)] = 0;
int b[offsetof(Trida, member)] = 0;
Překlad selže a překladač mi v chybě napíše, do jak velkého pole jsem se snažil ten int nacpat.