#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)]();
Комментариев нет:
Отправить комментарий