programing

이미 멤셋 등이 있는데 ZeroMemory 등이 존재하는 이유는 무엇입니까?

padding 2023. 9. 20. 20:09
반응형

이미 멤셋 등이 있는데 ZeroMemory 등이 존재하는 이유는 무엇입니까?

왜 그럴까요?ZeroMemory(), C 표준 라이브러리에 이미 memset 및 관련 호출이 있을 때 윈도우 API에 유사한 호출이 존재합니까?어느 쪽으로 전화를 할까요?답은 "의존"이라고 추측할 수 있습니다.무슨 일로?

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++ 프로그램에서.

실제 이유는 다른 플랫폼에서 보다 효율적으로 구현될 수 있기 때문입니다.memset. Windows NT는 휴대성이 뛰어난 운영 체제로 설계되었으며 실제로 Alpha, MIPS 및 Power PC에서 실행된다는 사실을 잊지 마십시오.따라서 fooPC 플랫폼이 나와서 메모리를 0으로 초고속으로 설정할 수 있는 조립 방법이 있다면 상위 API를 변경하지 않고 구현할 수 있습니다.이제 x86 및 amd64 플랫폼만 지원하므로 Windows의 경우에는 더 이상 해당되지 않지만 Windows CE의 경우는 여전히 해당됩니다.

ZeroMemory윈도우 API 자체의 일부입니다.memset는 C 표준 라이브러리의 일부입니다.

일반적인 사용자 코드의 경우, 보통은memset(또는 선택 언어에서 제공하는 동등한 것).다음과 같은 것을 사용하여 커널 코드(예: 디바이스 드라이버)를 작성하는 경우ZeroMemory더 매력적입니다.코드는 커널 모드에서 실행되므로 사용하는 작업 전환 비용이 들지 않습니다.이미 Windows 코드에 있기 때문에 이미 있는 것을 복제하기 위해 드라이버에 추가 코드를 가지고 다니는 것이 아닙니다.동시에, 당신은 함수 호출의 비용을 발생시키고, 메모리의 경우 또는 제로잉(특히 작은 블록) 메모리의 경우, 인라인 코드는 상당히 더 빠를 수 있고, 그리고 a.rep stosd코드를 많이 사용하지 않습니다(실제로 설정 및 사용).rep stosd함수가 호출하는 코드보다 더 적은 코드를 사용할 수 있습니다.

Windows API는 언어에 구애받지 않아야 하기 때문입니다.개발자가 사용하는 언어에 상관없이 충분한 기능을 제공합니다.물론 결국 많은 기능이 언어가 제공하는 기존 기능을 복제하게 될 것입니다.

특정 수준의 제어가 필요할 때마다 winapi 함수(및 매크로)를 직접 호출해야 합니다. 비교해 보십시오.fopen()와 함께CreateFile()예를 들어. 않으면 API 합니다.그렇지 않으면 API 호출보다 언어별 구성을 선호합니다.적어도 플랫폼 독립성은 더 높아집니다.

사실 여러분이 쓰실 건.

는 에 할 수 .memset(),그리고.SecureZeroMemory()이를 방지하기 위해 고안된 것입니다.

는 .ZeroMemory()제가 이 사실을 알게 되기 전까지는 전화는 불필요했습니다.

ZeroMemory는 주석 줄이 필요 없기 때문입니다.

한 가지 점은 프로그래밍 언어에 관계없이 모든 Win32 프로젝트에서 메모리 할당 기능이 동일하게 보여야 한다는 것입니다.실제로, 앞서 지적한 바와 같이, C에서 제로 메모리는 실제로 C 기능인 멤셋입니다.델파이에서.

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

여기서 FillChar는 델파이 함수입니다.등등:

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;

...

MSDN에 따르면 ZeroMemory는 매크로입니다.이는 아마도 편리함(예: 명명 규칙) 또는 역호환성을 위해 존재할 것입니다.

언급URL : https://stackoverflow.com/questions/3038302/why-do-zeromemory-etc-exist-when-there-are-memset-etc-already

반응형