std::vector (ab) używa automatycznego przechowywania

std::vector (ab) używa automatycznego przechowywania

Nie ma ograniczeń co do ilości automatycznej pamięci używanej przez standardowe API.

Wszystkie mogą wymagać 12 terabajtów miejsca na stosie.

Jednak ten interfejs API wymaga tylko Cpp17DefaultInsertable , a implementacja tworzy dodatkowe wystąpienie w stosunku do tego, co jest wymagane przez konstruktora. O ile nie jest on zamknięty za wykryciem, że obiekt jest trywialnie torowalny i kopiowalny, ta implementacja wygląda na nielegalną.


Podważam założenie „najbardziej”. Ponieważ pamięć ogromnego obiektu nigdy nie jest używana, kompilator może go całkowicie zignorować i nigdy nie przydzielić pamięci, w takim przypadku nie doszłoby do awarii.

Standard C++ nie ogranicza użycia stosu ani nawet nie potwierdza istnienia stosu. Więc tak, jest zgodny ze standardem. Można jednak uznać to za problem z jakością implementacji.

Wydaje się, że tak jest w przypadku libstdc++. Awaria nie została odtworzona w libc++ (przy użyciu clang), więc wydaje się, że nie jest to ograniczenie w języku, a raczej tylko w tej konkretnej implementacji.


Nie jestem prawnikiem językowym ani ekspertem od standardu C++, ale cppreference.com mówi:

Być może źle rozumiem „wstawione domyślnie”, ale spodziewałbym się:

std::vector<huge_type> v(1);

być równoważnym

std::vector<huge_type> v;
v.emplace_back();

Druga wersja nie powinna tworzyć kopii stosu, ale konstruować huge_type bezpośrednio w pamięci dynamicznej wektora.

Nie mogę autorytatywnie powiedzieć, że to, co widzisz, jest niezgodne, ale z pewnością nie tego oczekiwałbym od wysokiej jakości implementacji.