Когда я 0-инициализирую вектор Имеет ли он тот же эффект, что и calloc?
Так calloc
вызывает операционную систему для поиска обнуленных страниц в куче: /questions/40528833/pochemu-mallocmemset-medlennee-chem-calloc/40528838#40528838
Как насчет C++11 vector
конструктор, который принимает только size_t
и 0-инициализирует значения? Спросите у ОС обнуленную страницу в общем случае, или она должна инициализировать себя, потому что vector
элементы могут быть классом с инициализатором по умолчанию, который по умолчанию имеет ненулевое значение для членов?
1 ответ
std::vector<T>
является частью реализации, что означает, что мы можем видеть только результаты, не обязательно магию за кулисами. Кроме того, сама реализация может (частично) специализироваться std::vector<T>
до тех пор, пока наблюдаемые результаты остаются прежними.
Однако это не значит, std::vector<int>
можно просто попросить ОС обнулить память. Это все еще должно пройти std::allocator
а также ::operator new
, даже если вы заменили последний.
Конечно, по законам магии компилятора, если компилятор знает, что вы этого не сделали, он все равно может запросить ОС напрямую. Но главная проблема с этой логикой - отдельная компиляция. При компиляции A.cpp, содержащей std::vector<int>
, компилятор не будет знать, что B.cpp содержит ::operator new
,