C++之引用

很久没写博客了,感觉自己很久没有静下心来认真学习了,今天一起合租的舍友都走了,一个人静下心来学习了一天,写写博客。

引用

引用是C++较C新增的一个概念,今天简单研究了下引用的实现。

先写一小段代码看看:

#include <iostream>

int main(void) {
    using namespace std;

    int a = 5;
    int & d=a;
    d=8;

    cout << d;
    cout << a;
}

看一下它的汇编代码,有点长,就只看跟引用有关那一部分吧:

    movl    $5, -20(%rbp)
    leaq    -20(%rbp), %rax
    movq    %rax, -16(%rbp)
    movq    -16(%rbp), %rax
    movl    $8, (%rax)

从汇编代码中可以看出来,引用也占用了内存空间了,并且这个引用里面存的是变量a的地址(leaq取址)。

诶,怎么有点像指针呢,那再写一段代码看看:

#include <iostream>

int main(void) {
    using namespace std;

    int a = 5;
    int *d= &a;
    *d=8;

    cout << *d;
    cout << a;
}

汇编一下;

movl	$5, -20(%rbp)
leaq	-20(%rbp), %rax
movq	%rax, -16(%rbp)
movq	-16(%rbp), %rax
movl	$8, (%rax)

诶,巧了,一毛一样,不太确定,diff一下

diff -y pointer.s reference.s | colordiff
.file   "pointer.cpp"                                 |         .file   "reference.cpp"

诶,只有第一行不一样。

SO

所以,C++里面的引用和指针实现是类似的,都是存了地址。只是它们的语法定义、声明方式和使用方式不一样而已,但这些区别只是对编译器来说有区别,它们最终的汇编代码是一样哒。


comments powered by Disqus