31

C標準ライブラリにmemsetおよび関連する呼び出しがすでに存在するのに、なぜZeroMemory()、および同様の呼び出しがWindows APIに存在するのですか?どれに電話すればいいですか?答えは「依存」だと思います。何の上に?

4

8 に答える 8

43

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++プログラムを好みます。

于 2010-06-14T15:33:42.787 に答える
11

実際の理由は、別のプラットフォームでは、よりも効率的な方法で実装される可能性があるためですmemset。Windows NTは、移植性の高いオペレーティングシステムとして設計されており、実際にはAlpha、MIPS、およびPowerPCで動作することを忘れないでください。したがって、fooPCプラットフォームが登場し、メモリをゼロに超高速で設定するためのアセンブリ方法がある場合は、高レベルAPIを変更せずに実装できます。これは、x86およびamd64プラットフォームのみをサポートするようになったため、Windowsには当てはまりませんが、WindowsCEには当てはまります。

于 2010-06-15T00:57:29.617 に答える
9

ZeroMemoryこれらはWindowsAPI自体の一部です。memsetC標準ライブラリの一部です。

典型的なユーザーランドコードの場合、私は通常使用しますmemset(または選択した言語によって提供される同等のもの)。のようなものを使用してカーネルコード(デバイスドライバなど)を記述している場合ZeroMemoryは、より魅力的です。とにかくコードはカーネルモードで実行されるため、コードを使用するためのタスクスイッチのコストは発生しません。これはすでにWindowsコードに含まれているため、既に存在するものを複製するためにドライバーに余分なコードを持ち歩く必要はありません。同時に、関数呼び出しのコストが発生します。メモリのゼロ化(特に小さなブロック)の場合、インラインコードは大幅に高速になる可能性があり、rep stosd多くのコードを必要としません(実際には設定アップして使用rep stosdすると、関数呼び出しよりも少ないコードで済む場合があります)。

于 2010-06-14T15:12:45.677 に答える
6

WindowsAPIは言語に依存しない必要があるためです。使用する言語に関係なく、開発者に十分な機能を提供します。もちろん、最終的には多くの機能が言語によって提供される既存の機能を複製します。

特定のレベルの制御が必要な場合はいつでも、winapi関数(およびマクロ)を直接呼び出す必要があります。たとえば、と比較fopen()してください。CreateFile()それ以外の場合は、API呼び出しよりも言語固有の構成を優先します。少なくとも、プラットフォームに依存しないようになります。

于 2010-06-14T15:10:24.013 に答える
6

実は、使いたいSecureZeroMemory()のはです。

memset()最適化コンパイラは、への呼び出しを削除できSecureZeroMemory()、これを防ぐように設計されています。

ZeroMemory()私はこの事実に出くわすまで、電話は不要だと思っていました。

于 2013-02-20T22:09:14.770 に答える
4

なぜなら、ZeroMemoryはコメント行を必要としないからです

于 2010-06-14T15:13:01.387 に答える
3

1つのポイントは、メモリ割り当て関数は、プログラミング言語に関係なく、すべての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;

...
于 2010-06-14T15:56:23.600 に答える
1

MSDNによると、ZeroMemoryはマクロです。これは、便宜上(たとえば、命名規則)または下位互換性のために存在する可能性があります。

于 2010-06-14T15:10:41.033 に答える