如何在分配期间自动将动态分配的浮点数组设置为零(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 :(得分:33)
使用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 ++实现每个float使用四个字节,则以下关系成立:零是特殊情况。
如果这看起来很奇怪,请记住memset是在&lt; cstring&gt;中声明的。或&lt; string.h&gt;,通常用于制作“***************”或“--------------- ---”。它也可以用于零记忆是一个很好的副作用。
正如MilanBabuškov在评论中指出的那样,有一个功能bzero(非标准和弃用),暂时可用于Mac和Linux但不适用于Microsoft,因为它专门用于将内存设置为零,安全省略一些说明。如果您使用它,并且编译器的未来发布版本省略了它,那么在本地兼容性补丁中自己实现bzero是微不足道的,除非将来的版本重新使用名称用于其他目的
答案 1 :(得分:15)
使用
#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
答案 2 :(得分:12)
通过使用一对空括号跟随数组大小,可以将动态分配的数组的元素初始化为元素类型的默认值:
float* delay_line = new float[filter_len]();
答案 3 :(得分:11)
改为使用 std :: vector :
std::vector<float> delay_line( filter_len );
向量将初始化为零。
答案 4 :(得分:3)
现在我们已经开始了:更好的方法是使用vector
类。
std::vector< float > delay_line( filter_len, 0.0 );
答案 5 :(得分:3)
另一个选择是使用calloc同时分配和归零:
float *delay_line = (float *)calloc(sizeof(float), filter_len);
这里的优点是,根据你的malloc实现,如果已知从已经归零的内存中分配数组(通常是从操作系统分配的页面),则可以避免将数组归零。
请记住,你必须在这样的数组上使用free()而不是delete []。
答案 6 :(得分:2)
memset可能要快一点,但是要关注!?!?微观优化到这个水平是完全浪费时间,除非你正在编程计算器,甚至可能不是那么。哪种方式最有效
我认为memset方式更清晰,但我认为你真的最好检查一下你的memset的man-pages ...如果你的标准库版本有一个带有 float的memset函数,我会感到很惊讶作为第二个论点。
PS:表示零的位模式对于整数和浮点数都是相同的......这是设计的,而不仅仅是好运。
祝你好运; - )
干杯。基思。