Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态分配浮点数组并将其设置为零_C++_Arrays_Floating Point_Initializing - Fatal编程技术网

C++ 动态分配浮点数组并将其设置为零

C++ 动态分配浮点数组并将其设置为零,c++,arrays,floating-point,initializing,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; float*delay\u line=新的浮点

如何在分配期间将动态分配的浮点数组自动设置为零(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;
float*delay\u line=新的浮点[过滤器长度];
//这个
memset(延迟线,0.0,滤波器长度)//我能为一个花车做这个吗??
//还是这个
对于(int i=0;i
哪种方法最有效

谢谢使用

#include <algorithm>
...
std::fill_n( delay_line, filer_len, 0 )
#包括
...
标准::填充(延迟线,文件管理器长度,0)
使用
sizeof(float)*filter\u len
,除非您在一些奇怪的实现中工作,其中
sizeof(float)==sizeof(char)

编辑:正如评论中指出的那样,0.0对于memset来说是一个特别容易编码的浮点值,因为0.0的IEEE标准表示都是零位

memset在内存领域中运行,而不是在数字领域。第二个参数声明为int,被转换为无符号字符。如果C++实现使用每个浮点使用四个字节,则以下关系保持:

  • 如果将浮点值设为0,则该值将为0.0
  • 如果将浮点值设为1,则该值将为2.36943e-38
  • 如果将浮点设置为42,则该值将为1.51137e-13
  • 如果将浮点设置为64,则该值将为3.00392
所以零是一个特例

如果这看起来很奇怪,回想一下memset是在or中声明的,并且经常用于生成诸如“*************”或“------------------------”之类的内容。它还可以用于零内存,这是一个很好的副作用


正如Milan Babuškov在评论中指出的那样,有一个函数bzero(非标准且已弃用),目前在Mac和Linux上可用,但在Microsoft上不可用,因为它专门用于将内存设置为零,所以安全地省略了一些指令。如果您使用它,并且编译器的一个清教徒式的未来版本省略了它,那么在本地兼容性补丁中自己实现bzero是微不足道的,除非将来的版本将该名称用于其他目的。

现在我们已经做到了:最好使用
vector

std::vector< float > delay_line( filter_len, 0.0 );
std::vector延迟线(过滤器长度,0.0);

使用std::vector来代替:

std::vector<float> delay_line( filter_len );
std::矢量延迟线(滤波器);
向量将被初始化为零

哪种方法最有效

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

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

PS:表示零的位模式对于整数和浮点都是相同的。。。这是故意的,不仅仅是好运

祝你好运;-)


干杯。Keith.

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

float* delay_line = new float[filter_len]();

另一个选项是使用calloc同时分配和归零:

float *delay_line = (float *)calloc(sizeof(float), filter_len);
这里的优势在于,根据您的malloc实现,如果已知阵列是从已经归零的内存中分配的(从操作系统分配的页面通常都是这样),则可以避免将阵列归零


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

但请看Neil的回答:您不需要0.0参数:这是默认的初始化参数值。谢谢,这会将延迟线中的每个值设置为0.0吗?是的,这会将每个值设置为0.0:如果符号、指数和分数为0,然后浮点表示0:IEEE 754完全与C++标准无关。在C++标准中没有任何东西说明实现必须遵循IEEE 754。而且,如果你沿着这个路径走下去,B0应该比MeSET快:@米兰:同意,B0更能体现程序员的意图。查看glibc中bzero.c和memset.c的实现,bzero能够省去一些|=操作,因为它不需要处理某人通过268435521的情况,因为他想要“a”。唉,bzero不是标准的C语言。抨击微优化完全是浪费时间。如果QS不需要优化,为什么他会问哪种方法是最有效的?我更喜欢MeSET,但是不确定浮点0的二进制表示是否与整数0相同。谢谢你清除UPF如果你不能使用向量,这是最安全的,现代C++方式来做。memset可能会更快,但它只是在不进行类型检查的情况下将字节归零,如果你的数学算错了,你就有麻烦了。我同意fill\n是首选的方法,即使它比memset稍微慢一点(我只相信当我看到它时;),与memset相比,这种方法是类型安全的,而且更容易“扩展/适应”(您也可以使用此方法初始化为,例如4.2)这不是最有效的方法,但肯定是最优雅的方法。就程序员的工作而言,它是最有效的(无需管理销毁),这通常是需要优化的最重要的事情。无需管理堆栈上数组的销毁或构造:-)就程序员的努力而言,最有效的方法是让经理标记需要零浮点数组“不会修复”的请求。托马斯,你应该在简历中写上:“避免修复的经验”现代C++智慧:这难道不是最好的答案吗?
float *delay_line = (float *)calloc(sizeof(float), filter_len);