Гарантировано ли, что 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
).
Беспокоитесь больше о поэзии, чем призыв к новому.