19

割り当て中に動的に割り当てられたfloatの配列をゼロ(0.0)に自動的に設定するにはどうすればよいですか?

これでいい

float* delay_line = new float[filter_len];

//THIS
memset(delay_line, 0.0, filter_len); //can I do this for a float??

//OR THIS
for (int i = 0; i < filter_len; i++)
  delay_line[i] = 0.0;

これが最も効率的な方法です

ありがとう

4

7 に答える 7

34

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を実装するのは簡単です。

于 2009-05-18T12:06:25.897 に答える
15

使用する

#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
于 2009-05-18T12:05:51.560 に答える
14

動的に割り当てられた配列の要素は、空の括弧のペアで配列サイズを追跡することにより、要素タイプのデフォルト値に初期化できます。

float* delay_line = new float[filter_len]();
于 2009-05-18T22:37:36.603 に答える
11

代わりにstd::vectorを使用してください:

std::vector<float> delay_line( filter_len );

ベクトルはゼロで初期化されます。

于 2009-05-18T12:08:53.503 に答える
3

今、私たちはそれに取り組んでいます:さらに良いのは、vectorクラスを使用することです。

std::vector< float > delay_line( filter_len, 0.0 );
于 2009-05-18T12:08:41.023 に答える
3

もう 1 つのオプションは、calloc を使用して割り当てとゼロを同時に行うことです。

float *delay_line = (float *)calloc(sizeof(float), filter_len);

ここでの利点は、malloc の実装によっては、配列が既にゼロ化されているメモリから割り当てられていることがわかっている場合、配列のゼロ化を回避できる可能性があることです (オペレーティング システムから割り当てられたページはよくあることです)。

このような配列では、[] を削除するのではなく、free() を使用する必要があることに注意してください。

于 2009-05-18T22:57:13.320 に答える
2

最も効率的な方法はどれですか

memset は少し速いかもしれませんが、誰が気にしますか!?!? このレベルまでのマイクロ最適化は、電卓をプログラミングしていない限り、時間の無駄です。

memset の方法の方が明確だと思いますが、memset のマンページを確認したほうがよいと思います...標準ライブラリのバージョンに、floatを 2 番目の引数として取る memset 関数がある場合、私は驚かれることでしょう。

PS: ゼロを表すビット パターンは、整数と浮動小数点の両方で同じです...これは設計によるものであり、運が良かっただけではありません。

幸運を ;-)

乾杯。キース。

于 2009-05-18T12:15:24.193 に答える