为什么完全启用数据结构的“constexpr”会导致编译后的代码更大?
Why does full `constexpr` enabling of a data structure cause the compiled code to be bigger?
在 Jason Turner 的 2016 CppCon 演讲“实用性能实践”的 this 时刻,他提到了每个数据结构的完整 constexpr 启用(我猜这意味着使每个字段和函数都 constexpr这可能是)会导致更大的代码“因为这会导致更多的数据结构被编译到你的代码中,所以你在数据段中拥有的数据比运行时计算的数据更多”(这句话是什么的组合他实际上是在这个时间戳上说的,以及他在最后说的作为对有关该主题的问题的回答)。
我不太明白那是什么意思。为什么 constexpr 数据结构编译后比非 constexpr 数据结构更大?有没有人有一个实际的例子来说明这一点?
在微控制器上实现 7 位循环冗余校验 (CRC) 算法时,我发现提前构建 256 字节查找 table 很方便,代码如下:
uint8_t crc_table[256];
for (unsigned int i = 0; i < 256; i++)
{
crc_table[i] = some_crc_function(i);
}
所以如果你把 crc_table
变成一个在编译时计算的 constexpr
东西,你的工具链必须在你的 execu[=18] 中存储一个 256 字节的 table =],占用space。它还可以删除生成 CRC table 的代码,但如果该代码的机器指令占用的字节数少于 256 个字节,那么我希望 executable 变得更大。
在 Jason Turner 的 2016 CppCon 演讲“实用性能实践”的 this 时刻,他提到了每个数据结构的完整 constexpr 启用(我猜这意味着使每个字段和函数都 constexpr这可能是)会导致更大的代码“因为这会导致更多的数据结构被编译到你的代码中,所以你在数据段中拥有的数据比运行时计算的数据更多”(这句话是什么的组合他实际上是在这个时间戳上说的,以及他在最后说的作为对有关该主题的问题的回答)。
我不太明白那是什么意思。为什么 constexpr 数据结构编译后比非 constexpr 数据结构更大?有没有人有一个实际的例子来说明这一点?
在微控制器上实现 7 位循环冗余校验 (CRC) 算法时,我发现提前构建 256 字节查找 table 很方便,代码如下:
uint8_t crc_table[256];
for (unsigned int i = 0; i < 256; i++)
{
crc_table[i] = some_crc_function(i);
}
所以如果你把 crc_table
变成一个在编译时计算的 constexpr
东西,你的工具链必须在你的 execu[=18] 中存储一个 256 字节的 table =],占用space。它还可以删除生成 CRC table 的代码,但如果该代码的机器指令占用的字节数少于 256 个字节,那么我希望 executable 变得更大。