Страницы

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

пятница, 31 января 2020 г.

Заполнить нулями без memset и ZeroMemory (C++)

#cpp #memory


Добрый вечер! Необходимо реализовать полностью без CRT.

{
    STARTUPINFO SI;
    ZeroMemory(&SI, sizeof(STARTUPINFO));
}


В данном коде, необходимо заполнить SI нулями. С CRT сделать это можно с помощью
memset или ZeroMemory(которому тоже нужен memset). Мне эти два варианта не подходят,
как можно сделать это без поддержки CRT?

Сработает ли, если я просто объявлю SI таким способом? Спасибо.

STARTUPINFO SI[sizeof(STARTUPINFO)]{0};

    


Ответы

Ответ 1



Со времен классического С в языке есть идиоматический Универсальный Нулевой Инициализатор { 0 }, который может использоваться для инициализации нулем/нулями вообще чего угодно. В вашем случае STARTUPINFO SI = { 0 }; В языке С++, в силу ряда С++ тонкостей, вариант { 0 } не всегда применим, а его роль выполняет инициализатор {} STARTUPINFO SI = {}; Разумеется, в С++ все это будет работать как нулевой инициализатор только если класс не определяет своих конструкторов. Отдельно можно заметить, что синтаксис {} инициализирует объект-приемник логическими значениями 0, внутреннее физическое представление которых не обязано состоять из набора нулевых битов. А memset и ZeroMemeory как раз таки наоборот, физически обнуляют память, забивая ее нулевыми битами. Так что в общем случае стоит подумать о том, что именно вам нужно.

Ответ 2



Так STARTUPINFO SI[sizeof(STARTUPINFO)]{0}; вы пытаетесь объявить целый массив STARTUPINFO. Объявите просто STARTUPINFO SI{ 0 }; Только вот тот же VC++ 2015, если посмотреть ассемблерный код, все равно при таком обнулении вызывает memset. Просто невидимо для вас.

Ответ 3



В современных версиях C++ (тестировал на VS 2017) можно ещё проще: STARTUPINFO SI { }; Требуемый в некоторых старых компиляторах ноль больше не нужен.

Ответ 4



Как вариант, можно использовать placement new: new(&SI)char[sizeof(SI)]();

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

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