sizeof(float) * filter_len
奇妙な実装で作業している場合を除いて、を使用してくださいsizeof(float) == sizeof(char)
。
memset(delay_line, 0, sizeof(float) * filter_len);
編集:Stephan202がコメントで指摘しているように、0.0のIEEE標準表現はすべてゼロビットであるため、0.0はmemsetのコーディングに特に簡単な浮動小数点値です。
memsetは、数値の領域ではなく、メモリの領域で動作しています。intとして宣言された2番目のパラメーターは、unsignedcharにキャストされます。C ++の実装がfloatごとに4バイトを使用する場合、次の関係が成り立ちます。
- フロートを0でmemsetすると、値は0.0になります。
- フロートを1でmemsetすると、値は2.36943e-38になります。
- フロートを42でmemsetすると、値は1.51137e-13になります。
- フロートを64でmemsetすると、値は3.00392になります。
したがって、ゼロは特殊なケースです。
これが奇妙に思われる場合は、memsetが<cstring>または<string.h>で宣言されており、「***************」や「- ----------------」。メモリをゼロにするためにも使用できるということは、気の利いた副作用です。
MilanBabuškovがコメントで指摘しているように、MacとLinuxでは今のところ利用できる関数bzero(非標準で非推奨)がありますが、Microsoftでは利用できません。これはメモリをゼロに設定するように特別に調整されているため、いくつかの命令を安全に省略します。これを使用し、コンパイラの純粋な将来のリリースで省略されている場合、将来のリリースで名前を他の目的で再利用しない限り、ローカル互換性パッチで自分でbzeroを実装するのは簡単です。