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

18 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;
Run Code Online (Sandbox Code Playgroud)

哪种方式最有效

谢谢

Tho*_*day 33

sizeof(float) * filter_len除非你在一些奇怪的实施工作,否则使用sizeof(float) == sizeof(char).

memset(delay_line, 0, sizeof(float) * filter_len);
Run Code Online (Sandbox Code Playgroud)

编辑:正如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是在<cstring>或<string.h>中声明的,并且通常用于制作"***************"或" - ----------------".它可以用于零记忆是一个很好的副作用.

正如MilanBabuškov在评论中指出的那样,有一个功能bzero(非标准和弃用),暂时可用于Mac和Linux而不是Microsoft,因为它专门用于将内存设置为零,安全地省略了一些指令.如果您使用它,并且编译器的未来发布版本省略了它,那么在本地兼容性补丁中自己实现bzero是微不足道的,除非将来的版本重新使用该名称用于其他目的.

  • 是的,这会将每个值设置为0.0:如果sign,exponent和fraction为0,则float表示0.0:http://en.wikipedia.org/wiki/IEEE_754-1985 (6认同)

xto*_*ofl 15

使用

#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
Run Code Online (Sandbox Code Playgroud)


Bru*_*nez 12

通过使用一对空括号跟随数组大小,可以将动态分配的数组的元素初始化为元素类型的默认值:

float* delay_line = new float[filter_len]();
Run Code Online (Sandbox Code Playgroud)

  • 现代 C++ 明智:这不应该被提升为最佳答案吗? (2认同)

小智 11

改为使用std :: vector:

std::vector<float> delay_line( filter_len );
Run Code Online (Sandbox Code Playgroud)

向量将初始化为零.

  • 它在程序员工作方面效率最高(无需管理破坏),这通常是最重要的优化. (3认同)