Гарантировано ли, что std :: vector default construction не вызывает новый?

Согласно ссылке простой std::vector<T> vec; создает контейнер emtpy (конструктор по умолчанию). Означает ли это, что динамического распределения памяти нет? Или может ли реализация зарезервировать память?

Я знал, что для этого пустого конструктора нет конструкции типа T так как С++ 11. Однако, интересно, если есть также гарантия, что на кучу ничего не выделяется. Т.е., что вышеприведенная строка - всего несколько nullptr на стек/член.

Я тестировал его с помощью vc140, где он действительно свободен от динамических распределений.

Ответ 1

Означает ли это, что динамического распределения памяти нет?

Нет. Однако довольно типично, что реализация не выделяет память. Я не видел реализацию стандартной библиотеки.

Или может ли реализация зарезервировать память?

Возможно, но это нетипично.

Я знал, что для этого пустого конструктора нет конструкции типа T так как С++ 11

Также до С++ 11.

Ответ 2

Библиотека std является частью языка C++.

Почти любой вызов любого класса или функции библиотеки std мог бы делать патологические и безумные вещи. Но то же самое верно и для int x=7; - стандарт не написан для защиты от откровенно враждебных C++ реализаций, включающих библиотеку std.

При этом конструктор нулевого аргумента для std-вектора не является исключением. Это означает, что он не предназначен для выделения. Враждебная реализация может свободно выделять, ловить любые ошибки и действовать независимо от того, выполнено ли распределение. Враждебная реализация также может рассчитывать до 47 триллионов, запускать БПФ на случайных данных, разворачивать нейронную сеть и обучать ее Шекспиру, составлять некоторые сонеты, а затем действовать так, как будто ничего не произошло. В стандарте нечего сказать о ненаблюдаемой поэтической композиции любой операции в C++; пока действие не имеет наблюдаемых (в рамках абстрактной машины) побочных эффектов, стандарт не имеет никакого мнения.

На практике нет никакой причины для размещения std::vector<T>(), и никакая последующая операция на нем не может предполагать, что она выделена. Я мог видеть, что инструментальная сборка выделяет некоторый токен отслеживания продолжительности жизни для принудительного применения ошибок аннулирования итератора, но это можно было бы включить только при отладке с дополнительными флагами (например, -DCMP_JUN17).

Беспокоитесь больше о поэзии, чем призыв к новому.