Страницы

Поиск по вопросам

понедельник, 15 октября 2018 г.

zero-initialization и memset в конструкторе

Аналогичны ли два этих конструктора?
struct Test { int i; int j; };
struct Fcn { Test test; Fcn() { memset(&test, 0, sizeof(test)); } };
и
struct Fcn { Test test; Fcn(): test{} { } };
Ведь по-сути компилятор вставляет тот же самый memset во втором случае. Или нет?


Ответ

В данном конкретном случае - да, ибо memset(..., 0, ...) для целочисленных типов гарантирует корректную нулевую инициализацию.
В общем случае - нет (даже если не рассматривать типы с нетривиальной конструкцией), ибо, например, для указательных, плавающих и некоторых других типов в общем случае не гарантируется корректной нулевой инициализации через memset(..., 0, ...)
Пример, демонстрирующий разницу для многих популярных реализаций может выглядеть так
struct Test { int Test::*i; int Test::*j; };
т.к. нулевое значение указателя-на-член-данное обычно представляется битовым набором 0xFF...F, а не нулевым набором битов.
Также следует принять во внимание замечание @VladD об инициализации паддинга.

Комментариев нет:

Отправить комментарий