C++ C++;运行时设置的固定大小数组的容器

C++ C++;运行时设置的固定大小数组的容器,c++,arrays,C++,Arrays,我有一个模拟代码,它的瓶颈是在一个数据块上运行3个嵌套的for循环,这个数据块就像一个3D数组,由一个变量指向,比如double***three_d_arr,并对每个值进行数学运算。我不知道编译时数组的大小。数组大小在运行时确定,永远不会调整大小。我想知道是否值得切换到C++容器中去清除我的代码> ***>代码>。我看了很多关于裸数组与std::array与boost::array与std::vector的讨论,我能找到的所有讨论都是在以下情况下进行的:1)数组大小在编译时是固定且已知的,或2)

我有一个模拟代码,它的瓶颈是在一个数据块上运行3个嵌套的for循环,这个数据块就像一个3D数组,由一个变量指向,比如
double***three_d_arr
,并对每个值进行数学运算。我不知道编译时数组的大小。数组大小在运行时确定,永远不会调整大小。我想知道是否值得切换到C++容器中去清除我的代码> ***>代码>。我看了很多关于裸数组与std::array与boost::array与std::vector的讨论,我能找到的所有讨论都是在以下情况下进行的:1)数组大小在编译时是固定且已知的,或2)数组大小在整个代码中动态变化。我找不到与我的情况相符的讨论。在我的案例中,放弃牺牲速度的最佳选择是什么?

BLITIZ++是一个C++的库,用于用数组来进行高性能工作。可能值得检查一下。划掉
std::array
。它是编译时大小的<代码>向量的向量没有保证的连续性,当代码从一个向量反弹到分散在内存中的另一个向量时,可能会导致性能受损的缓存未命中<代码>boost::array我对它了解得不够,无法发表评论。我,我会研究一下
boost::array
,看看它是如何工作的,然后可能会制作一个包装类,使一维向量看起来像三维的。这样我就得到了所需的三维索引和一维数组的紧密空间位置。如果没有分析,这是不可能的。还有许多用于矩阵计算的库。您需要移植代表性样本、运行、比较和选择。正确编写并启用可能的优化对性能至关重要。
double***
的问题在于编译器不知道前两层的差异,因此假定最后一层为别名。它还防止编译器使用指针增量的线性索引。关键是,如果您的代码是沿着其中一个数组维度的关键循环,请优化该维度,而忽略其他两个维度。如果关键循环是用C编写的,带有
restrict
ed指针,那么实际的容器就更不重要了。有些人喜欢
std::valarray
s和
std::(g)slice
s。