Страницы

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

вторник, 10 декабря 2019 г.

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

#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 об инициализации паддинга.

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

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