19

如何在分配期间自动将动态分配的浮点数组设置为零(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 是一个特别容易为 memset 编码的浮点值,因为 0.0 的 IEEE 标准表示都是零位。

memset 在内存领域运行,而不是在数字领域。第二个参数,声明为 int,被强制转换为 unsigned char。如果您的 C++ 实现每个浮点数使用四个字节,则以下关系成立:

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

所以零是一个特例。

如果这看起来很奇怪,回想一下 memset 是在 <cstring> 或 <string.h> 中声明的,并且经常用于制作诸如“***************”或“-- ----"。它可以用于零内存是一个很好的副作用。

正如 Milan Babuškov 在评论中指出的那样,有一个功能 bzero (非标准且已弃用),目前在 Mac 和 Linux 上可用,但在 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

另一种选择是使用 calloc 同时分配和归零:

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

这里的优点是,根据您的 malloc 实现,如果已知数组是从已经清零的内存中分配的(因为通常是从操作系统分配的页面),则可以避免将数组清零

请记住,您必须在这样的数组上使用 free() 而不是 delete []。

于 2009-05-18T22:57:13.320 回答
3

现在我们已经完成了:更好的是使用这个vector类。

std::vector< float > delay_line( filter_len, 0.0 );
于 2009-05-18T12:08:41.023 回答
2

哪种方式最有效

memset 可能快一点,但谁在乎!?!?微优化到这个级别完全是浪费时间,除非你正在编写一个计算器,甚至可能不会。

我认为 memset 的方式更清晰,但我认为你真的最好检查你的手册页中的 memset ...如果你的标准库版本有一个 memset 函数,它以浮点数作为第二个参数,我会感到惊讶。

PS:表示零的位模式对于整数和浮点数都是相同的......这是设计使然,不仅仅是祝你好运。

祝你好运 ;-)

干杯。基思。

于 2009-05-18T12:15:24.193 回答