bool AND 的 C 尾调用优化

标签 c gcc optimization tail-call-optimization

GCC 是否对以下函数进行尾调用优化?

bool isEqual(Node *head1, Node *head2)
{
    if(head1 == NULL || head2 == NULL)
        return head1 == NULL && head2 == NULL;
    return head1->data == head2->data && isEqual(head1->next, head2->next);
}

最佳答案

是的,至少我编译它的方式是这样。该函数的汇编代码是

isEqual(Node*, Node*):
    test    rdi, rdi
    sete    dl
    test    rsi, rsi
    sete    cl
    mov eax, ecx
    or  al, dl
    jne .L2
    mov edx, DWORD PTR [rsi+8]
    cmp DWORD PTR [rdi+8], edx
    je  .L5
    rep ret
.L2:
    mov eax, ecx
    and eax, edx
    ret
.L5:
    mov rdi, QWORD PTR [rdi]
    mov rsi, QWORD PTR [rsi]
    test    rdi, rdi
    sete    dl
    test    rsi, rsi
    sete    cl
    mov eax, ecx
    or  al, dl
    jne .L2
    mov ecx, DWORD PTR [rsi+8]
    cmp DWORD PTR [rdi+8], ecx
    je  .L5
    rep ret

那显然是一个循环,并没有出现嵌套调用。

您应该验证它是否与您平台上的 GCC 版本和您的编译选项类似。

关于 bool AND 的 C 尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26428100/

相关文章:

C 中的冲突类型

c - C 中的分而治之,可能到达非 void 函数的末尾

c - C 中空格等于 '\0' 吗?我怎样才能避免混淆它们?

无法让简单的 GTK3 应用程序运行

c++ - 比 memcmp 快

c - exit()函数的使用

windows - 如何在 Windows 10 上安装旧版本的 GCC

c++ - x86_64-pc-cygwin-gcc 链接器错误

java - 为什么 javac 甚至不优化简单的代码?

performance - 检查两个 SSE 寄存器是否均不为零而不破坏它们