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