提问者:小点点

如何将巨大头分配数组设置为特定浮点数C++


一开始,我通过使用Intel Math内核库API来分配一个巨大的块内存。 之后,我想将这个数组设置为特定值,例如1234.5678。 我计划使用void*memset(void*dest,int ch,std::size_t count);函数,但似乎这个函数只能设置int值。 我可以使用简单的for循环来解决这个问题。 但是,我认为使用for loop为如此巨大的块设置初始值并不是很高效。 所以我的问题是

  1. 我有没有另外一种方法来初始化如此巨大的块内存而不使用for loop

共2个答案

匿名用户

可以使用std::fill_n为数组的每个值分配一个值

#include <algorithm>

std::fill_n(data, count, 1234.5678);

请注意,即使使用raw for循环,许多编译器也会生成相同的代码

for (std::size_t i = 0; i < count; ++i)
{
    data[i] = 1234.5678;
}

请参阅此编译器资源管理器示例,在上述两种情况下生成相同的程序集代码

void fill_a(double *,unsigned __int64) PROC                         ; fill_a
$LN14:
        sub     rsp, 8
        test    rdx, rdx
        je      SHORT $LN6@fill_a
        mov     QWORD PTR [rsp], rdi
        mov     rax, 4653144502051863213      ; 40934a456d5cfaadH
        mov     rdi, rcx
        mov     rcx, rdx
        rep stosq
        mov     rdi, QWORD PTR [rsp]
$LN6@fill_a:
        add     rsp, 8
        ret     0

匿名用户

我计划使用void*memset(void*dest,int ch,std::size_t count); 函数,但似乎这个函数只能设置int值。

实际上,您可以使用memset来设置浮点1的值,甚至可以设置任何简单的可复制类型的值。 int ch只是将在数据上复制的字节的值。

但是,这确实意味着您不能使用memset为多字节类型设置任意值,因为所有字节都将重复。 例如,您可以将整数设置为0,即4个0字节,或者将4个字节的整数设置为4369,即4个1字节。

在32位IEEE 754符合浮点数的情况下,您可以通过以下操作将memset设置为值785.066650391F:std::memset(ptr,count*sizeof(float),0x44)。 这是因为该特定数字由四个重复的0x44字节组成。

具体值,例如1234.5678

这个特定的值不是由重复的字节组成的,所以不能用memset创建它。

我可以使用简单的for循环来解决这个问题

正确。

然而,我认为使用for循环来为如此巨大块设置初始值并不是非常有效的

您可能会惊讶地发现编译器在优化循环方面有多么出色。 有时他们用调用memset来替换循环(当它会有相同的结果时); 其他时候,它们会导致比调用memset更快的代码(嗯,至少在理论上是这样的。编译器也知道memset的功能,如果认为可能更快的话,也可以用从循环生成的内联代码替换对它的调用)。

但是,您不需要自己编写循环。 正如Cory Kramer所展示的,标准库中有一个用于此的算法。

1的警告是,语言标准没有指定浮点类型的位表示形式,因此得到的值在技术上可能是无意义的,甚至是陷阱表示形式。 另一方面,IEEE 754是相当普遍的,并且您可以依赖于它取决于用例。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(如何将|巨|大头|分配|数组|设置|特定|浮点数|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?