Почему ZeroMemory и т. Д. Существуют, когда уже есть memset и т. Д.?

Как все сказали ... метод .equals - это то, что вам нужно.

В случайном случае вы использовали что-то вроде:

if(argv[0] == "a")

, тогда оно не работает, потому что == сравнивает расположение двух объектов (физическое равенство), а не содержимое ( логическое равенство).

Поскольку «a» из командной строки и «a» в исходной для вашей программы распределены в двух разных местах, использование == не может быть использовано. Вы должны использовать метод equals, который будет проверять, чтобы убедиться, что обе строки имеют одинаковые символы.

Другое примечание ... «a» == «a» будет работать во многих случаях, поскольку строки являются специальными в Java, но 99.99999999999999% времени, которое вы хотите использовать .equals.

23
задан Deduplicator 1 October 2018 в 21:42
поделиться

8 ответов

В C и C ++ ZeroMemory() и memset() - это одно и то же.

/* In winnt.h */
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

/* In winbase.h */
#define ZeroMemory RtlZeroMemory

Зачем тогда использовать ZeroMemory()? Чтобы сделать это очевидным. Но я предпочитаю memset() в программах на C или C ++.

34
ответ дан In silico 1 October 2018 в 21:42
поделиться

Потому что ZeroMemory не требует строки комментария

3
ответ дан Paweł Sołtysiak 1 October 2018 в 21:42
поделиться

На самом деле то, что вы хотите использовать , это SecureZeroMemory() .

Оптимизирующий компилятор может удалять вызовы memset(), и SecureZeroMemory() предназначен для предотвращения этого.

Раньше я думал, что звонки ZeroMemory() не нужны, пока не наткнулся на этот факт.

2
ответ дан richard.albury 1 October 2018 в 21:42
поделиться

Фактическая причина в том, что на другой платформе это может быть реализовано более эффективным способом, чем memset . Не забывайте, что Windows NT была разработана как очень портативная операционная система, на самом деле она работала на Alpha, MIPS и Power PC. Итак, если платформа fooPC вышла и имеет какой-то способ сборки для сверхбыстрой установки памяти в ноль, это можно реализовать без изменения высокоуровневого API. Это больше не относится к Windows, поскольку теперь она поддерживает только платформы x86 и amd64, однако это все еще верно для Windows CE.

11
ответ дан 28 November 2019 в 18:10
поделиться

Поскольку Windows API должен быть языковым- агностик. Он обеспечивает достаточную функциональность для разработчиков, независимо от того, какой язык они используют. Конечно, со временем многие функции будут дублировать существующие функциональные возможности, предлагаемые языками.

Вы должны вызывать функции winapi (и макросы ) напрямую всякий раз, когда вам нужен определенный уровень контроля - сравните fopen () с CreateFile () например. В противном случае предпочтите конструкции, зависящие от языка, а не вызовы API. По крайней мере, вы получите больше независимости от платформы.

6
ответ дан 28 November 2019 в 18:10
поделиться

Согласно MSDN , ZeroMemory является макросом. Вероятно, он существует для удобства (например, соглашения об именах) или для обратной совместимости.

1
ответ дан 28 November 2019 в 18:10
поделиться

Я думаю, что один момент заключается в том, что функции распределения памяти должны выглядеть одинаково во всех проектах Win32, независимо от языка программирования. В самом деле, как уже указывалось ранее, в C ZeroMemory на самом деле является memset, функцией C. В Delphi

procedure ZeroMemory(Destination: Pointer; Length: DWORD);
begin
  FillChar(Destination^, Length, 0);
end;

, где FillChar - это функция Delphi. И так далее:

procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
  Move(Source^, Destination^, Length);
end;

procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte);
begin
  FillChar(Destination^, Length, Fill);
end;

...
3
ответ дан 28 November 2019 в 18:10
поделиться

ZeroMemory и другие являются частью самого Windows API. memset является частью стандартной библиотеки C.

Для типичного пользовательского кода я обычно использую memset (или эквивалент, предоставляемый вашим языком по выбору). Если вы пишете код ядра (например, драйвер устройства), используя что-то вроде ZeroMemory , более привлекательно.Поскольку ваш код в любом случае выполняется в режиме ядра, вы не несете затрат на переключение задач на его использование. Поскольку он уже находится в коде Windows, вы не переносите дополнительный код в свой драйвер, чтобы дублировать то, что уже есть. В то же время вы несете затраты на вызов функции, и в случае обнуления (особенно небольшого блока) памяти встроенный код может быть значительно быстрее, а rep stosd - нет. занимает много кода (фактически, установка и использование rep stosd может занять меньше кода, чем вызов функции).

8
ответ дан 28 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: