gpt4 book ai didi

c++ - 编译时循环优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:02 25 4
gpt4 key购买 nike

我发现有点难以理解为什么以下结果会导致编译时计算。我读过this , this , this和关于 stackoverflow 的更多问题告诉我以下代码(至少根据我的理解)不应该在编译时计算,因为 while 循环(该代码只是说明问题的示例):

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;
}

这会输出以下没有标志的 assembly代码(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

注意那里没有跳转,while 条件下没有分支,什么都没有。我的印象是 for-loops和 while 循环 were not possible在编译时进行评估。但是,编译器 (gcc 8.2) 在编译时评估结果。我唯一的想法是这是由于循环展开而发生的,所以我尝试使用 -fno-unroll-loops,但这导致相同的汇编代码。另一方面,根据我的经验,这个标志更多更像是编译器建议而不是保证,即使设置了标志,gcc 仍可能展开循环。

我的问题的简短版本:我的 constexpr 函数中的 while 循环如何在编译时求值?

最佳答案

在 C++14 中,constexpr放宽了功能要求。

以前,在 C++11 中,constexpr 函数只能包含 typedefstatic_assertusing,但只能包含一个返回声明。

在 C++14 中,可以在 constexpr 函数体中使用循环。

因为 b 被声明为 constexpr char,它必须在编译时被评估。然后编译器优化了 isStringNice 函数,因为它在运行时不被使用。

关于c++ - 编译时循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262802/

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