如何在分配期间自动将动态分配的浮点数组设置为零(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;
哪种方式最有效
谢谢
如何在分配期间自动将动态分配的浮点数组设置为零(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 编码的浮点值,因为 0.0 的 IEEE 标准表示都是零位。
memset 在内存领域运行,而不是在数字领域。第二个参数,声明为 int,被强制转换为 unsigned char。如果您的 C++ 实现每个浮点数使用四个字节,则以下关系成立:
所以零是一个特例。
如果这看起来很奇怪,回想一下 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:
std::vector<float> delay_line( filter_len );
向量将被初始化为零。
另一种选择是使用 calloc 同时分配和归零:
float *delay_line = (float *)calloc(sizeof(float), filter_len);
这里的优点是,根据您的 malloc 实现,如果已知数组是从已经清零的内存中分配的(因为通常是从操作系统分配的页面),则可以避免将数组清零
请记住,您必须在这样的数组上使用 free() 而不是 delete []。
现在我们已经完成了:更好的是使用这个vector
类。
std::vector< float > delay_line( filter_len, 0.0 );
哪种方式最有效
memset 可能快一点,但谁在乎!?!?微优化到这个级别完全是浪费时间,除非你正在编写一个计算器,甚至可能不会。
我认为 memset 的方式更清晰,但我认为你真的最好检查你的手册页中的 memset ...如果你的标准库版本有一个 memset 函数,它以浮点数作为第二个参数,我会感到惊讶。
PS:表示零的位模式对于整数和浮点数都是相同的......这是设计使然,不仅仅是祝你好运。
祝你好运 ;-)
干杯。基思。