C++ 优化 - 堆栈分配的数组类型与外部链接维度?

Posted

技术标签:

【中文标题】C++ 优化 - 堆栈分配的数组类型与外部链接维度?【英文标题】:C++ optimization - stack allocated array type with externally linked dimension? 【发布时间】:2021-06-23 14:56:28 【问题描述】:

我是 C++ 优化的新手。我读过堆栈分配的内存可以比堆分配的内存快得多。

我还读到 std::array 是堆栈分配的,但大多数其他容器,例如 std::vector 或动态数组是堆分配的。我想定义一个基本上只存储双精度数组的类。我打算让类的所有实例都具有相同的维度,并且我可以在编译时计算出该维度的大小。问题是我想在 main.cpp 而不是 class.cpp 中计算该维度。这意味着尝试以下方法:

class.h:
extern constexpr dimension;

和,

class.cpp:
class Coordinates 
    public std::array<double, dimension> q; 

然后

main.cpp:
#include "class.h"
constexpr dimension = 2*3*100

现在,extern constexpr dimension 是无稽之谈,因为翻译单元在编译时不会知道维度的值。

有没有办法让堆栈分配的数组类型对象具有在另一个翻译单元中定义的维度?它甚至值得吗?

【问题讨论】:

带有堆栈分配器的向量怎么样?使用 alloca()? 我能想到的最好的事情是main 分配数组,因为只有它知道大小,并在构造时将其提供给对象。我认为你被困在这个问题上。 我强烈怀疑 std::array 是堆栈分配的,因为您必须以某种方式将 alloca() 的结果传递给 std::array 对象。你从哪里听到这样的信息?话虽如此,您可以使用正确的就地构造函数和 alloca() 堆栈分配几乎任何东西。 STL 不支持堆栈分配,因为这是一种非常危险的做法。 std::array 可以分配到任何地方。可以是堆栈,可以是静态存储,可以是动态存储(new std::array&lt;&gt; “我打算让类的所有实例都具有相同的维度”然后使用模板 class Coordinates 【参考方案1】:

您要的是模板:

template<int dimension>
struct Coordinates 
    std::array<double, dimension> q; 
;

用法:

int main()

    constexpr auto dimension = 2*3*100;
    Coordinates<dimension> c;
    c.q[0] = 1;
    c.q[1] = 2;
    // ...

Demo

【讨论】:

这正是我所要求的!我没有意识到模板可以是非类型变量。这个优势(静态分配而不是动态分配)在这篇关于主题的文章中指出:learncpp reference

以上是关于C++ 优化 - 堆栈分配的数组类型与外部链接维度?的主要内容,如果未能解决你的问题,请参考以下文章

当返回可能在 C++ 中的堆栈上分配的成员时,最好的指针/引用类型是啥?

寻找类似 C++ STL 的向量类但使用堆栈存储

GC优化策略-下篇

在堆栈上分配不完整的类型

如何在堆栈上分配数组以获得性能提升?

c++ 数组与 std::vector 和 std::array 的效率