Как все сказали ... метод .equals - это то, что вам нужно.
В случайном случае вы использовали что-то вроде:
if(argv[0] == "a")
, тогда оно не работает, потому что == сравнивает расположение двух объектов (физическое равенство), а не содержимое ( логическое равенство).
Поскольку «a» из командной строки и «a» в исходной для вашей программы распределены в двух разных местах, использование == не может быть использовано. Вы должны использовать метод equals, который будет проверять, чтобы убедиться, что обе строки имеют одинаковые символы.
Другое примечание ... «a» == «a» будет работать во многих случаях, поскольку строки являются специальными в Java, но 99.99999999999999% времени, которое вы хотите использовать .equals.
В 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 ++.
Потому что ZeroMemory не требует строки комментария
На самом деле то, что вы хотите использовать , это SecureZeroMemory()
.
Оптимизирующий компилятор может удалять вызовы memset()
, и SecureZeroMemory()
предназначен для предотвращения этого.
Раньше я думал, что звонки ZeroMemory()
не нужны, пока не наткнулся на этот факт.
Фактическая причина в том, что на другой платформе это может быть реализовано более эффективным способом, чем memset
. Не забывайте, что Windows NT была разработана как очень портативная операционная система, на самом деле она работала на Alpha, MIPS и Power PC. Итак, если платформа fooPC вышла и имеет какой-то способ сборки для сверхбыстрой установки памяти в ноль, это можно реализовать без изменения высокоуровневого API. Это больше не относится к Windows, поскольку теперь она поддерживает только платформы x86 и amd64, однако это все еще верно для Windows CE.
Поскольку Windows API должен быть языковым- агностик. Он обеспечивает достаточную функциональность для разработчиков, независимо от того, какой язык они используют. Конечно, со временем многие функции будут дублировать существующие функциональные возможности, предлагаемые языками.
Вы должны вызывать функции winapi (и макросы ) напрямую всякий раз, когда вам нужен определенный уровень контроля - сравните fopen ()
с CreateFile ()
например. В противном случае предпочтите конструкции, зависящие от языка, а не вызовы API. По крайней мере, вы получите больше независимости от платформы.
Согласно MSDN , ZeroMemory является макросом. Вероятно, он существует для удобства (например, соглашения об именах) или для обратной совместимости.
Я думаю, что один момент заключается в том, что функции распределения памяти должны выглядеть одинаково во всех проектах 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;
...
ZeroMemory
и другие являются частью самого Windows API. memset
является частью стандартной библиотеки C.
Для типичного пользовательского кода я обычно использую memset
(или эквивалент, предоставляемый вашим языком по выбору). Если вы пишете код ядра (например, драйвер устройства), используя что-то вроде ZeroMemory
, более привлекательно.Поскольку ваш код в любом случае выполняется в режиме ядра, вы не несете затрат на переключение задач на его использование. Поскольку он уже находится в коде Windows, вы не переносите дополнительный код в свой драйвер, чтобы дублировать то, что уже есть. В то же время вы несете затраты на вызов функции, и в случае обнуления (особенно небольшого блока) памяти встроенный код может быть значительно быстрее, а rep stosd
- нет. занимает много кода (фактически, установка и использование rep stosd
может занять меньше кода, чем вызов функции).