#cpp #language_lawyer
Аналогичны ли два этих конструктора?
struct Test
{
int i;
int j;
};
struct Fcn
{
Test test;
Fcn()
{
memset(&test, 0, sizeof(test));
}
};
и
struct Fcn
{
Test test;
Fcn(): test{}
{
}
};
Ведь по-сути компилятор вставляет тот же самый memset во втором случае. Или нет?
Ответы
Ответ 1
В данном конкретном случае - да, ибо memset(..., 0, ...) для целочисленных типов гарантирует корректную нулевую инициализацию. В общем случае - нет (даже если не рассматривать типы с нетривиальной конструкцией), ибо, например, для указательных, плавающих и некоторых других типов в общем случае не гарантируется корректной нулевой инициализации через memset(..., 0, ...). Пример, демонстрирующий разницу для многих популярных реализаций может выглядеть так struct Test { int Test::*i; int Test::*j; }; т.к. нулевое значение указателя-на-член-данное обычно представляется битовым набором 0xFF...F, а не нулевым набором битов. Также следует принять во внимание замечание @VladD об инициализации паддинга.
Комментариев нет:
Отправить комментарий