【问题标题】:C tail call optimization for boolean AND布尔 AND 的 C 尾调用优化
【发布时间】:2014-10-17 15:12:40
【问题描述】:

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

【问题讨论】:

    标签: c gcc optimization tail-call-optimization


    【解决方案1】:

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

    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 版本以及您的编译选项有类似的作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-31
      • 2011-07-11
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多