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

257
02 августа 2017, 21:28

Аналогичны ли два этих конструктора?

struct Test
{
    int i;
    int j;
};
class Fcn
{
    Test test;
    public:
    Fcn()
    {
        memset(&test, 0 , sizeof(test));
    }
};

и

class Fcn
{   
    Test test;
    public:
    Fcn(): test{}
    {
    }
};

Ведь по-сути компилятор вставляет тот же самый memset во втором случае. Или нет?

Answer 1

В данном конкретном случае - да, ибо memset(..., 0, ...) для целочисленных типов гарантирует корректную нулевую инициализацию.

В общем случае - нет (даже если не рассматривать типы с нетривиальной конструкцией), ибо, например, для указательных, плавающих и некоторых других типов в общем случае не гарантируется корректной нулевой инициализации через memset(..., 0, ...).

Пример, демонстрирующий разницу для многих популярных реализаций может выглядеть так

struct Test
{
  int Test::*i;
  int Test::*j;
};

т.к. нулевое значение указателя-на-член-данное обычно представляется битовым набором 0xFF...F, а не нулевым набором битов.

Также следует принять во внимание замечание @VladD об инициализации паддинга.

READ ALSO
Бряк в visual studio при удалениии массива

Бряк в visual studio при удалениии массива

В целом, я даже не уверен ещё правильно ли освобождаю память, и освобождается ли она вообщено на запуске дебаггер ругается именно на этот...

243
Не могу добавить в вектор умный указатель

Не могу добавить в вектор умный указатель

Имеется класс MyClass, разумеется с конструктором, нужно создать вектор умных указателей на объекты этого классаСам указатель создается, но при...

213
Отображение контента по кнопка jquery

Отображение контента по кнопка jquery

ПриветствуюСверстал страницу на bootstrap'e

249
Валидация формы c input

Валидация формы c input

Здравствуйте, мне не хватает стандартной функции required для input сейчас мне надо сделать следующее

225