编译时循环优化
Compile-time loop optimisation
我发现很难理解为什么以下会导致编译时间计算。我已经读过这个,这个,这个关于stackoverflow的更多问题告诉我以下代码(至少要涉及我的理解),因此不应在编译时间计算,因为该循环是一个循环(该代码只是说明问题的示例):
template< unsigned N >
constexpr unsigned isStringNice(const char (&arr)[N], unsigned pos = 0)
{
//we do not like the 'D' char :)
int currPos = 0;
while(currPos < N){
if(arr [currPos] == 'D'){
throw 1;
}
currPos ++;
}
return 1;
}
constexpr unsigned isIdxValid( unsigned idx, unsigned len){
return idx >= len? throw 1 : idx;
}
template< unsigned N >
constexpr char nth_char(const char (&arr)[N], unsigned pos){
return isStringNice(arr),isIdxValid(pos, N),arr[pos];
}
int main(){
constexpr char b = nth_char("ABC", 2);
return b;
}
这无标志输出以下装配代码(GCC 8.2,谢谢Godbolt)主:
push rbp
mov rbp, rsp
mov BYTE PTR [rbp-1], 67
mov eax, 67
pop rbp
ret
和-o3
main:
mov eax, 67
ret
请注意,因为那里没有跳跃,在当时没有分支,什么也没有。我的印象是,在编译时无法评估循环和循环。但是,编译器(GCC 8.2)在编译时间评估结果。我唯一的想法是由于循环展开而发生这种情况,所以我尝试使用-fno-unroll-loops
,但是这导致了相同的装配代码。另一方面,从我的经验中,此标志更像是编译器的建议,而不是保证,而GCC仍可能展开即使设置了标志。
我的问题的简短版本:在编译时如何评估我的constexpr函数中的我的way循环?
在C 14中,constexpr
功能要求放松。
以前,在C 11中,constexpr函数只能包含typedef
s, static_assert
s和 using
s,但只有一个返回语句。
在C 14中,可以在constexpr
功能体中使用循环。
因为b
被声明为constexpr char
,因此必须在编译时评估必须评估。然后,编译器优化了isStringNice
功能,因为它在运行时不使用。
相关文章:
- gcc 如何优化此循环?
- 循环比较(优化)
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 优化在网格图中查找哈密尔循环的函数?
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 在循环条件中调用const vector size()似乎缺少优化
- GCC 优化了基于固定范围的 for 循环,就好像它具有更长的可变长度一样
- 通过循环展开和阻塞进行优化
- 为什么 CLang++ 不优化循环,而 G++ 优化循环?
- 嵌套循环 C++ 的优化
- 如何在卷积程序的 c++ 中优化嵌套循环
- G 4.8.5带负数组索引的循环优化错误
- 使用 OpenMP 优化外循环并减少
- C是否优化了循环的检查部分
- 如何分析优化的代码并加快循环
- 如何优化循环/if语句的C
- 使用for_each标准或提升工具优化循环
- 在模板专门化中优化循环和避免代码重复
- 矢量化/优化循环,用于宽寄存器(特别是Xeon Phi)的未对齐数据访问
- 使用GCC优化C/ c++循环中的嵌套if语句