高效地以随机顺序填充大表

问题描述 投票:0回答:1

给定一个二维表,例如:

struct POD
{
    int someData;
    float someOtherData;
    bool someMoreData;
    // Other basic numerical types...
};

我如何有效地用这样的值填充二维表。具体来说(例如在多线程上下文中)以随机顺序,一次填充整行。

在 C 语言中,我会:

  1. 计算并分配表中的索引
  2. 实际分配数组
  3. 任何线程都可以根据基指针及其索引计算出需要写入的位置 并将该内存视为可以写入的较小子数组。

我如何有效地将其转换为 C++(理想情况下使用 STL 容器)。一些补充说明/问题:

  • 我主要担心的是STL库初始化分配的内存,我不知道这会导致多少开销。 (示例表大小 50000x20x(16 字节))
  • 理想情况下,在创建新表时重用不再需要的表会很好
  • 任何解决方案都应该支持使用对齐存储的能力。

请注意:

std::vector::reserve
+
std::vector::emplace_back
不起作用,因为表应支持随机顺序初始化/填充。

c++ memory stl containers
1个回答
0
投票

只做最简单可行的事情:

using LargeTable = std::vector<std::vector<POD>>;

void fillRow(LargeTable& large_table, int row) {
  std::vector<POD> temp;
  temp.reserve(20); // Allocates memory but does not initialize it.
  // call temp.emplace_back or temp.push_back 20 times
  large_table[row] = std::move(temp);
}

在顶层,执行以下操作:

LargeTable large_table(50000);

并且以某种方式调用

fillRow
50000 次,无论你想要多少个线程。

© www.soinside.com 2019 - 2024. All rights reserved.