gpt4 book ai didi

c++ - 转置模板参数包

转载 作者:行者123 更新时间:2023-12-04 14:46:48 26 4
gpt4 key购买 nike

我想将行优先参数列表传递给 constexpr 构造函数,并将数据存储在列优先数组中。我必须将模板参数包从行优先转换为列优先,我想出的唯一方法是使用这样的临时数组:

template <typename T, std::size_t rows, std::size_t cols = rows>
class Matrix final
{
public:
std::array<T, cols * rows> m; // column-major matrix

template <typename ...A>
constexpr Matrix(const A... args) noexcept:
m{transpose(std::array<T, rows * cols>{args...}, std::make_index_sequence<rows * cols>{})}
{}

template <std::size_t ...i>
constexpr auto transpose(const std::array<T, cols * rows> a,
const std::index_sequence<i...>) noexcept
{
return std::array<T, cols * rows>{a[((i % rows) * cols + i / rows)]...};
}
};

我想没有其他方法可以乱序访问参数包中的元素,但也许有一种方法可以在没有中间数组的情况下做到这一点。

最佳答案

要在不删除功能的情况下显着提高调试构建的性能,您需要将 std::array 替换为更基本的无功能版本:

https://quick-bench.com/q/FS2cphByJEWMFMsquI_Yor8ZnyI

生成的版本 (ChangedArrayBasic) 比 Clang 12.0、-O0、libstdc++ 上的原始版本快约 2.8 倍。

不得使用索引运算符,因为它在实践中似乎很大程度上无法优化,而是需要手动访问内部数组。

template <class T, size_t N>
struct BasicCustomArray
{
T d[N];
};

template <typename T, std::size_t rows, std::size_t cols = rows>
class NewMatrixBasic final
{
public:
using Arr = BasicCustomArray<T, cols * rows>; // <-----------------------------
Arr m; // column-major matrix

template <typename ...A>
constexpr NewMatrixBasic(const A... args) noexcept:
m{transpose(Arr{args...}, std::make_index_sequence<rows * cols>{})}
{}

template <std::size_t ...i>
constexpr auto transpose(const Arr a,
const std::index_sequence<i...>) noexcept
{
return Arr{a.d[((i % rows) * cols + i / rows)]...}; // <---------------------
}
};

关于c++ - 转置模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69881904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com