tôi so 2 chương trình trên GNU/Linux. Chỉ có đầu ra GCC được hiển thị dưới đây, nhưng kết quả kêu vang dẫn đến kết luận giống hệt nhau.
phiên bản GCC:4.9.2
Clang phiên bản:3.4.2
Các chương trình
1.cpp
#include <stdio.h>
int main()
{
int x = 3;
printf("%d\n", x);
return 0;
}
2.cpp
#include <stdio.h>
int main()
{
int x = 3;
int & y = x;
printf("%d\n", y);
return 0;
}
Các thử nghiệm
Cố gắng 1: Không tối ưu hóa
gcc -S --std=c++11 1.cpp
gcc -S --std=c++11 2.cpp
lắp ráp kết quả 1.cpp là ngắn hơn.
Cố gắng 2: tối ưu hóa trên
gcc -S -O2 --std=c++11 1.cpp
gcc -S -O2 --std=c++11 2.cpp
Việc lắp ráp kết quả là hoàn toàn giống hệt nhau.
Sản lượng lắp ráp
1.cpp, không tối ưu hóa
.file "1.cpp"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $3, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
2.cpp, không tối ưu hóa
.file "2.cpp"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $3, -12(%rbp)
leaq -12(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
1.cpp, với tối ưu hóa
.file "1.cpp"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.unlikely,"ax",@progbits
.LCOLDB1:
.section .text.startup,"ax",@progbits
.LHOTB1:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB12:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $3, %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE12:
.size main, .-main
.section .text.unlikely
.LCOLDE1:
.section .text.startup
.LHOTE1:
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
2.cpp, với tối ưu hóa
.file "1.cpp"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.unlikely,"ax",@progbits
.LCOLDB1:
.section .text.startup,"ax",@progbits
.LHOTB1:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB12:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $3, %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE12:
.size main, .-main
.section .text.unlikely
.LCOLDE1:
.section .text.startup
.LHOTE1:
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
Kết luận
Không có chi phí thời gian chạy khi nói đến sản lượng GCC được tối ưu hóa. Tương tự với clang (thử nghiệm với phiên bản 3.4.2): khi tối ưu hóa được bật, mã assembly được tạo giống hệt nhau trong cả hai chương trình.
Câu trả lời hay. Cảm ơn – cheshirekow
Câu trả lời không chính xác. Một trong những ý định đằng sau các tham chiếu là thực hiện khái niệm về một bí danh, tên thay thế cho một đối tượng hiện có. Tôi tin rằng điều này được nêu rõ trong TC++ PL. Trong khi điều này không phải luôn luôn như vậy, "bí danh" vẫn là một mô tả chính xác về những tham chiếu trong nhiều trường hợp. – AnT
@AndreyT, tôi chưa bao giờ nghe ý tưởng về các tham chiếu là bí danh, bạn có thể cho tôi biết đoạn văn của tiêu chuẩn được hàm ý không? –