c++ - 从 constexpr 构造 const 数组

标签 c++ c++11 arm constexpr lookup-tables

假设为了论证,我在类中有以下私有(private) constexpr:

static constexpr uint16_t square_it(uint16_t x)
{
    return std::pow(x, 2);
}

然后我想使用上面的 constexpr 在同一类的同一部分中构造一个由这些值组成的静态常量数组,该数组的整数最大为 255:

static const uint16_t array_of_squares[256] =
{
    //something
};

如果可能的话,我希望在编译时构造数组,而不是在运行时构造数组。我认为第一个问题是,在 constexpr 中使用像 std::pow 这样的表达式不是有效的 ISO C++(尽管arm-gcc 可能允许?),因为它可能返回域错误。我想要使​​用的实际表达式是一个涉及 std::exp 的有点复杂的函数。

请注意,我没有太多可用的 std 库,因为我正在为小型微处理器 Cortex M4 进行编译。

有没有更合适的方法来做到这一点,比如使用预处理器宏?我非常希望避免在开发过程中每次需要修改表时使用外部 Python 脚本之类的东西来计算表,然后将其粘贴进去。

最佳答案

正如您所说,问题在于 C 标准库函数通常没有标记为 constexpr

如果您需要使用 std::exp,最好的解决方法是编写您自己的可以在编译时运行的实现。如果它是在编译时完成的,那么优化它可能是没有必要的,它只需要准确且适度高效即可。

有人问了如何做到这一点的问题here很久以前。您可以重用那里的想法并在 C++11 中重写为 constexpr 函数,尽管您必须重构它以避免 for 循环。在 C++14 中,需要较少的重构。

你也可以尝试严格通过模板来做,但是会更痛苦,而且 double 不能作为模板参数,所以会更复杂。

关于c++ - 从 constexpr 构造 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117906/

相关文章:

gdbserver 跟踪点臂支持

c++ - "class template"与 "template class"

c++ - 为什么cout返回smanip?

c++ - C++ ODB向mysql插入汉字问题

c++ - 为什么不能取nullptr的地址?

c++ - 扩展默认复制构造函数

assembly - ARMv8(也称为 AArch64 或 ARM64)的默认 FPU 是什么?

c++ - 奇怪的Qt include OSX下的目录结构

C++:2个数组之间的差异

assembly - ARM 汇编 SOS 中的 64 位除法