如何用1个真正大的数组快速初始化

Yod*_*oda 6 c++ arrays performance

我有一个很大的阵列:

int* arr = new int[BIGNUMBER];
Run Code Online (Sandbox Code Playgroud)

如何用1号码快速填充它.通常我会这样做

for(int i = 0; i < BIGNUMBER; i++)
    arr[i] = 1
Run Code Online (Sandbox Code Playgroud)

但我认为这需要很长时间.

我可以使用memcpy或类似吗?

And*_*owl 13

您可以尝试使用标准功能std::uninitialized_fill_n:

#include <memory>

// ...

std::uninitialized_fill_n(arr, BIGNUMBER, 1);
Run Code Online (Sandbox Code Playgroud)

在任何情况下,当涉及到性能时,规则是总是进行测量以支持您的假设 - 特别是如果您要放弃一个清晰,简单的设计来接受更复杂的设计,因为所谓的性能改进.

编辑:

请注意 - 正如本杰明林德利在评论中提到的那样 - 对于琐碎的类型std::uninitialized_fill_n并没有带来任何优势std::fill_n.对于非平凡类型存在优势,因为std::uninitialized_fill这将允许您分配内存区域,然后在适当的位置构造对象.

但是,不应该陷入调用初始化std::uninitialized_fill_n的内存区域的陷阱.例如,以下内容将给出未定义的行为:

my_object* v = new my_object[BIGNUMBER];
std::uninitialized_fill_n(my_object, BIGNUMBER, my_object(42)); // UB!
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,`uninitialized_fill_n`对更明显的`fill_n`提供了什么? (2认同)
  • 我在Linux上使用`gcc-4.7 -O3`测试了OP解决方案和'std :: uninitialized_fill`和`BIGNUMBER = 1 << 31`,并且性能没有显着差异. (2认同)
  • 但是对于非平凡类型,它将是未定义的行为,因为内存已经使用有效对象进行初始化.你必须使用`fill_n`.这是我的(小)反对意见,它对所有类型都更加一致.但我也理解你的理由. (2认同)