【问题标题】:Fastest array initialisation in C++C++ 中最快的数组初始化
【发布时间】:2013-10-25 12:33:46
【问题描述】:

将整数数组初始化为给定值的最快方法是什么?

如果我有 char 数组,我可以使用 memset:

char a[N];
memset( a, value, N );

如果数组类型 != char 和值 != 0 或 -1,我无法执行 memset:

int a[N];
memset( a, value, N*sizeof(int) ); // INCORRECT!

所以我想知道是否有办法对其他数组类型进行类似的内存初始化。

【问题讨论】:

  • int x[] = {1,2,3,4}.
  • 最快的方法?在内联汇编中的代码中有一个数据块(在它之前有一个跳转语句)并将您的数组指向它。但说真的,保持标准:使用std::fill
  • 最快如“我输入最快的东西”或“最快的速度”?如果是后者,数组初始化速度真的是您代码中的瓶颈吗?如果是这样(我觉得这不太可能)你应该重新设计你的代码。
  • Nik Bougalis,实际上两者都有:)。不,init 不是瓶颈,但可以通过许多小事情节省时间。
  • 注意:std::fill 是关于在整个数组中复制相同的值(如memset),但也有std::generate 允许您为每个索引生成不同的值。

标签: c++ arrays memory c++03


【解决方案1】:

使用std::fill:

char a[N];
std::fill(std::begin(a), std::end(a), value);

请注意,std::beginstd::end 从 C++11 开始定义。

如果您使用的是 C++03,那么这将起作用:

char a[N];
std::fill(a, a + N, value);

【讨论】:

  • 即使使用#include
  • 如果您需要它们,您可以轻松地将 beginend(以及其他迭代器实用程序)反向移植到 C++03。
【解决方案2】:

没有比聚合初始化更快的方法了:

int x = {1,2,3,4,5,6};

如果要将所有内容初始化为零,则可以利用语法对整个数组进行值初始化:

int x [50] = {};

这不同于:

int x[50];

因为当你指定一个初始化器时,未初始化的元素是值初始化的。如果不指定初始化器,则元素未初始化。

仅仅因为没有比int x[] = {....} 更快的方法,其他方法不一定更慢。您需要在实际平台上以发布模式进行分析才能确定。

【讨论】:

    【解决方案3】:

    我想你可以将 memset 与任何原始类型一起使用。

    int a[N] 
    memset(a, '0x00', N * sizeof (int))
    

    【讨论】:

    • 如果值为零,这可能(但不保证)有效,但不适用于其他值。
    【解决方案4】:

    您可以 memset 任何类型的对象/基元。毕竟一切都存储在内存中。

    也就是说,您确实必须了解您的编译器和处理器如何存储您正在 memset 的内容,以预测您将获得什么。如果做错了,它非常不便携且危险。

    现代桌面处理器的很多性能取决于您引用的对象是否在缓存中。所以很难说它是否会更快。在其他条件相同的情况下,它可能会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多