gpt4 book ai didi

c++ - 动态分配 float 组并将其设置为零

转载 作者:IT老高 更新时间:2023-10-28 21:58:57 24 4
gpt4 key购买 nike

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

哪种方式最有效

谢谢

最佳答案

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

  • 如果你将 float 设置为 0,则值为 0.0。
  • 如果你将 float 设置为 1,则值为 2.36943e-38。
  • 如果你将 float 设置为 42,则值为 1.51137e-13。
  • 如果你将 float 设置为 64,则值为 3.00392。

所以零是一个特例。

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

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

关于c++ - 动态分配 float 组并将其设置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/877385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com