Когда я 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,

Другие вопросы по тегам