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

307
16 июля 2017, 12:09

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

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

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

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

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

Со времен классического С в языке есть идиоматический Универсальный Нулевой Инициализатор { 0 }, который может использоваться для инициализации нулем/нулями вообще чего угодно. В вашем случае

STARTUPINFO SI = { 0 };

В языке С++, в силу ряда С++ тонкостей, вариант { 0 } не всегда применим, а его роль выполняет инициализатор {}

STARTUPINFO SI = {};

Разумеется, в С++ все это будет работать как нулевой инициализатор только если класс не определяет своих конструкторов.

Отдельно можно заметить, что синтаксис {} инициализирует объект-приемник логическими значениями 0, внутреннее физическое представление которых не обязано состоять из набора нулевых битов. А memset и ZeroMemeory как раз таки наоборот, физически обнуляют память, забивая ее нулевыми битами. Так что в общем случае стоит подумать о том, что именно вам нужно.

Answer 2

Так

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

вы пытаетесь объявить целый массив STARTUPINFO.

Объявите просто

STARTUPINFO SI{ 0 };

Только вот тот же VC++ 2015, если посмотреть ассемблерный код, все равно при таком обнулении вызывает memset. Просто невидимо для вас.

Answer 3

В современных версиях C++ (тестировал на VS 2017) можно ещё проще:

STARTUPINFO SI { };

Требуемый в некоторых старых компиляторах ноль больше не нужен.

Answer 4

Как вариант, можно использовать placement new:

new(&SI)char[sizeof(SI)]();
READ ALSO
Проблемы с Visual Studio

Проблемы с Visual Studio

Учился раньше на NetBeansРешил попробовать один из самых известных компиляторов

334
undefined reference to `__imp_WSAStartup'

undefined reference to `__imp_WSAStartup'

Что нужно добавить в CMakeList чтобы подключить Ws2_32lib?

286
Можно ли по параметрам драйвера камеры определить снимает ли она в перевёрнутом режиме, или нет?

Можно ли по параметрам драйвера камеры определить снимает ли она в перевёрнутом режиме, или нет?

Некоторые веб-камеры выдают перевёрнутые кадры, как правило из-за кривых драйверов

247
Использование функции getche()

Использование функции getche()

Пытаюсь добиться от программы, чтобы она подсчитывала количество букв и словVisual Studio выводит ошибку, указывая на getche()

237