Аналогичны ли два этих конструктора?
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 об инициализации паддинга.
Комментариев нет:
Отправить комментарий