Tôi đoán tất cả các bạn đã nghe về 'vấn đề trao đổi'; SO có đầy đủ các câu hỏi về nó. Phiên bản hoán đổi mà không sử dụng biến số thứ ba thường được coi là nhanh hơn vì, tốt, bạn có một biến ít hơn. Tôi muốn biết chuyện gì đang xảy ra đằng sau rèm cửa và viết hai chương trình sau:Hoán đổi biến có và không có biến phụ - nhanh hơn?
int main() {
int a = 9;
int b = 5;
int swap;
swap = a;
a = b;
b = swap;
return 0;
}
và phiên bản mà không biến thứ ba:
int main() {
int a = 9;
int b = 5;
a ^= b;
b ^= a;
a ^= b;
return 0;
}
tôi tạo ra mã assembly bằng kêu vang và nhận được điều này cho phiên bản đầu tiên (có sử dụng một biến thứ ba):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -8(%rbp), %ecx
movl %ecx, -16(%rbp)
movl -12(%rbp), %ecx
movl %ecx, -8(%rbp)
movl -16(%rbp), %ecx
movl %ecx, -12(%rbp)
popq %rbp
ret
Leh_func_end0:
...
và điều này cho phiên bản thứ hai (mà không sử dụng một biến thứ ba):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
movl -8(%rbp), %ecx
movl -12(%rbp), %edx
xorl %ecx, %edx
movl %edx, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
popq %rbp
ret
Leh_func_end0:
...
Điều thứ hai dài hơn nhưng tôi không biết nhiều về mã lắp ráp nên tôi không biết điều đó có nghĩa là nó chậm hơn vì vậy tôi muốn nghe ý kiến của ai đó có kiến thức hơn về nó.
Phiên bản trên của trao đổi biến nhanh hơn và mất ít bộ nhớ hơn?
Để tìm hiểu nhanh hơn, tại sao bạn không đánh giá nó? –
Tôi sẽ không biết cách đo lường mức sử dụng bộ nhớ cộng thêm, tôi cũng quan tâm đến những lý do đằng sau nó. – shutefan
Nó không giống như bạn biên soạn với tối ưu hóa bật. Có rất nhiều lông tơ trong hội đồng đó. –