[英]C tail call optimization for boolean AND
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版本以及您的編譯選項有相似之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.