Không có sự khác biệt, nhưng để có thêm kinh nghiệm (hậu môn?) Tôi đã thử nghiệm điều này với g ++, tạo ra một hàm cho mỗi đoạn mã. Cả hai có và không có tối ưu hóa, nó tạo ra giống hệt nhau mã bất kể nơi khai báo là int a
.
#include <iostream>
int variant_a(int b)
{
int a;
while(b > 0)
{
a = b % 3;
b /= 3;
}
return b;
}
int variant_b(int b)
{
while(b > 0)
{
int a = b % 3;
b /= 3;
}
return b;
}
int main()
{
std::cout << variant_a(42) << std::endl;
std::cout << variant_b(42) << std::endl;
}
Đây là vòng lặp được tối ưu hóa:
_Z9variant_ai:
.LFB952:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $24, %esp
.LCFI2:
jmp .L2
.L3:
movl 8(%ebp), %eax
movl %eax, -20(%ebp)
movl $1431655766, -24(%ebp)
movl -24(%ebp), %eax
imull -20(%ebp)
movl %edx, %ecx
movl -20(%ebp), %eax
sarl $31, %eax
subl %eax, %ecx
movl %ecx, %eax
addl %eax, %eax
addl %ecx, %eax
movl -20(%ebp), %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, -4(%ebp)
movl 8(%ebp), %eax
movl %eax, -20(%ebp)
movl $1431655766, -24(%ebp)
movl -24(%ebp), %eax
imull -20(%ebp)
movl %edx, %ecx
movl -20(%ebp), %eax
sarl $31, %eax
movl %ecx, %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, 8(%ebp)
.L2:
cmpl $0, 8(%ebp)
jg .L3
movl 8(%ebp), %eax
leave
ret
và tối ưu hóa một:
_Z9variant_ai:
.LFB968:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
pushl %ebx
.LCFI2:
movl 8(%ebp), %ebx
testl %ebx, %ebx
jle .L2
movl $1431655766, %ecx
.p2align 4,,7
.p2align 3
.L5:
movl %ebx, %eax
imull %ecx
movl %ebx, %eax
sarl $31, %eax
movl %edx, %ebx
subl %eax, %ebx
jne .L5
.L2:
movl %ebx, %eax
popl %ebx
popl %ebp
ret
Tại sao bạn không định thời gian cho cả hai giải pháp và tự mình xem? –
Nếu có bất kỳ sự khác biệt nào cả, thì bạn cần một trình biên dịch mới. –
chúng không tương đương. a là scoped đến vòng lặp while trong lần thứ hai nhưng với phạm vi kèm theo trong lần đầu tiên. –