【问题标题】:C++ Optimize performance defining multidimensional vectorC++ 优化性能定义多维向量
【发布时间】:2020-05-01 21:59:15
【问题描述】:

我对这段代码的详细阐述时间有疑问

vector <int>                        empty_a(120, 0);
vector <vector <int>>               empty_b(130, empty_a);
vector <vector <vector <int>>>      empty_c(220000, empty_b);
vector <vector <vector <vector <int>>>> res(3);

res[0]   =   empty_c;    
res[1]   =   empty_c;    
res[2]   =   empty_c;

这是我所知道的将 res 定义为 empty_c 的最快方法。 这需要太多时间。也在:

vector <vector <vector <int>>>      empty_c(220000, empty_b);

花很多时间。

有没有最快的方法? 我也在使用 -O3 选项。

谢谢

【问题讨论】:

  • 什么是res?你试过std::move吗?
  • 这将进行 ton 的分配。最好定义一个适当的类型来立即进行分配并提供您需要的任何访问功能。
  • 四个嵌套向量是.....没有。不要那样做。
  • 还有,应用是什么?
  • 基于场景的应用程序的运筹学研究。我需要一个包含每个场景和每个失败的一些信息的向量。

标签: c++ optimization vector


【解决方案1】:

假设您的整数为 4 个字节,则此向量表示至少 13 GB。

对于我能想到的大多数应用程序来说,这都大得离谱。

您有可能摆脱稀疏数组。如果没有,一旦达到这样的大小,只需分配一个向量并使用从 3D 到 1D 的映射,例如:

std::vector<int> flat(220000*120*130);
size_t At(size_t x, size_t y, size_t z) { return 120*130*z + 120*y+ x;}

flat[At(x,y,z)] = someValue;

或者使用专门的库来为您处理所有这些。

【讨论】:

  • 我从未见过这种方法,但我会尝试一下。非常感谢。如果你知道一个专业的图书馆,如果你能向我推荐的话。
  • 并且不要忘记由于所有嵌套,其中也有多少分配和指针
  • 顺便说一句,我不相信向量通常会预先过度分配;只有在容量用完时。
  • 最后,使用std::size_t 而不是int 来确保你有范围,因为那已经是索引类型了
  • 如果您在构造时或使用resize 为向量指定特定大小,它将准确分配该大小,只有插入或推送元素才会导致指数增长行为。正如@AsteroidsWithWings 所说,220000*120*1302^31 多,所以At 必须返回size_t 并且应该有size_t 参数,因此确保所有元素地址都有范围
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多