1

GCC は次の関数で Tail 呼び出しの最適化を実行しますか?

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

1 に答える 1

2

はい、少なくとも私がコンパイルした方法ではそうです。その関数のアセンブリ コードは

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 のバージョンとコンパイル オプションで同様のことが行われるかどうかを確認する必要があります。

于 2014-10-17T15:17:22.893 に答える