动态分配并设置为零浮点数组

时间:2009-05-18 12:02:41

标签: c++ arrays floating-point initializing

如何在分配期间自动将动态分配的浮点数组设置为零(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;

哪种方式最有效

由于

7 个答案:

答案 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使用四个字节,则以下关系成立:

  • 如果将浮点数设为0,则值为0.0。
  • 如果您将浮点数设为1,则值为2.36943e-38。
  • 如果你将浮点数设为42,则值为1.51137e-13。
  • 如果使用64 memset浮点数,则值为3.00392。

零是特殊情况。

如果这看起来很奇怪,请记住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:表示零的位模式对于整数和浮点数都是相同的......这是设计的,而不仅仅是好运。

祝你好运; - )

干杯。基思。