在动态分配数组时如何自动将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;
哪种方法最高效?
谢谢。
在动态分配数组时如何自动将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;
哪种方法最高效?
谢谢。
使用 sizeof(float) * filter_len
,除非你在一些奇怪的实现中工作,其中 sizeof(float) == sizeof(char)
。
memset(delay_line, 0, sizeof(float) * filter_len);
编辑:正如Stephan202在评论中所指出的那样,0.0是一种特别简单的浮点值,适用于memset,因为IEEE标准表示为0.0时,所有位都为零。
memset操作的是内存,而不是数字。第二个参数声明为int,被强制转换为unsigned char类型。如果您的C++实现每个浮点数使用4个字节,则以下关系成立:
所以0是一个特殊情况。
如果这看起来很奇怪,请记住,memset在<cstring>或<string.h>中声明,通常用于创建像“***************”或“------------------”之类的东西。它可以被用来将内存清零,这是一个巧妙的副作用。
正如Milan Babuškov在评论中指出的,有一个函数bzero(非标准且已弃用),目前在Mac和Linux上可用,但不适用于Microsoft。由于该函数专门用于将内存设置为零,因此安全地省略了一些指令。如果您使用它,并且将来版本的编译器省略了它,则可以在本地兼容性补丁中轻松实现bzero,除非将来版本已经重用了那个名称。
#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
动态分配数组的元素可以通过在数组大小后跟一对空括号来初始化为元素类型的默认值:
float* delay_line = new float[filter_len]();
std::vector<float> delay_line( filter_len );
向量将被初始化为零。
vector
类。std::vector< float > delay_line( filter_len, 0.0 );
另一种选择是使用calloc同时分配内存并将其清零:
float *delay_line = (float *)calloc(sizeof(float), filter_len);
哪种方式最有效
使用memset可能会稍微快一点,但是谁在乎呢?将微小的优化降到这个级别是完全浪费时间的,除非你在编写计算器,甚至可能也不需要。
我认为memset的方式更清晰,但是我认为你最好检查一下memset的手册……如果你的标准库版本将float作为第二个参数传递给memset函数,我会很惊讶的。
PS:表示零的位模式对于整数和浮点数是相同的……这是设计上的,不仅仅是好运气。
祝你好运;-)
干杯。 Keith。