【问题标题】:C++ optimization - stack allocated array type with externally linked dimension?C++ 优化 - 堆栈分配的数组类型与外部链接维度?
【发布时间】: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{}

标签: c++ arrays optimization


【解决方案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
猜你喜欢
  • 2021-02-24
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2018-04-10
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多