C++中的引用在初始化时占用内存吗?

43 篇文章 0 订阅
8 篇文章 0 订阅

这个问题,还没有完全研究完,先贴上一部分实验结果。
这里比较疑惑的有两个问题,c++中是怎么实现引用的和引用会和指针一样占用内存吗?
其实是一个问题,下面的实验都是在linux64 g++编译器平台
看第一段代码

#include<iostream>
using namespace std;

int main()
{
 int a=10;
 int* p =&a;
 int &q =a;

 cout<<&a<<endl;
 cout<<&p<<endl;
 cout<<&q<<endl;

 (*p)++;
 q++;
 cout<<a<<endl;
 return 0;
}

三个cout是将变量的地址打印出来
结果是

0x7fffffffe32c
0x7fffffffe330
0x7fffffffe32c
12

表面上看引用和变量是一个地址,看看目标代码的反汇编代码

int main()
{
  40087d:   55                      push   %rbp
  40087e:   48 89 e5                mov    %rsp,%rbp
  400881:   48 83 ec 20             sub    $0x20,%rsp
int a=10;
  400885:   c7 45 ec 0a 00 00 00    movl   $0xa,-0x14(%rbp)
int* p =&a;
  40088c:   48 8d 45 ec             lea    -0x14(%rbp),%rax
  400890:   48 89 45 f0             mov    %rax,-0x10(%rbp)
int &q =a;
  400894:   48 8d 45 ec             lea    -0x14(%rbp),%rax
  400898:   48 89 45 f8             mov    %rax,-0x8(%rbp)

cout<<&a<<endl;
  40089c:   48 8d 45 ec             lea    -0x14(%rbp),%rax
  4008a0:   48 89 c6                mov    %rax,%rsi
  4008a3:   bf 80 10 60 00          mov    $0x601080,%edi
  4008a8:   e8 b3 fe ff ff          callq  400760 <_ZNSolsEPKv@plt>
  4008ad:   be 80 07 40 00          mov    $0x400780,%esi
  4008b2:   48 89 c7                mov    %rax,%rdi
  4008b5:   e8 b6 fe ff ff          callq  400770 <_ZNSolsEPFRSoS_E@plt>
cout<<&p<<endl;
  4008ba:   48 8d 45 f0             lea    -0x10(%rbp),%rax
  4008be:   48 89 c6                mov    %rax,%rsi
  4008c1:   bf 80 10 60 00          mov    $0x601080,%edi
  4008c6:   e8 95 fe ff ff          callq  400760 <_ZNSolsEPKv@plt>
  4008cb:   be 80 07 40 00          mov    $0x400780,%esi
  4008d0:   48 89 c7                mov    %rax,%rdi
  4008d3:   e8 98 fe ff ff          callq  400770 <_ZNSolsEPFRSoS_E@plt>
cout<<&q<<endl;
  4008d8:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  4008dc:   48 89 c6                mov    %rax,%rsi
  4008df:   bf 80 10 60 00          mov    $0x601080,%edi
  4008e4:   e8 77 fe ff ff          callq  400760 <_ZNSolsEPKv@plt>
  4008e9:   be 80 07 40 00          mov    $0x400780,%esi
  4008ee:   48 89 c7                mov    %rax,%rdi
  4008f1:   e8 7a fe ff ff          callq  400770 <_ZNSolsEPFRSoS_E@plt>
。。。。。
}

主要看这段代码

int &q =a;
  400894:   48 8d 45 ec             lea    -0x14(%rbp),%rax
  400898:   48 89 45 f8             mov    %rax,-0x8(%rbp)

实际q这个所谓的别名是占有内存的,
那么为什么输出其地址时,输出的引用变量的地址,看看反汇编代码就知道了

cout<<&q<<endl;
  4008d8:   48 8b 45 f8             mov    -0x8(%rbp),%rax
cout<<&p<<endl;
  4008ba:   48 8d 45 f0             lea    -0x10(%rbp),%rax

看看这两者的区别,对于取引用地址,是获取的原变量的地址,而取指针地址,则是将自己的内存地址输出去。

为了进一步说明这个问题 ,再用一段代码

struct  test1
{
 int a;
 int& p;
};
struct test2
{
 int a;
};
struct test3
{
 int a;
 int* p;
};
int main()
{
 cout<<sizeof(test1)<<endl;
 cout<<sizeof(test2)<<endl;
 cout<<sizeof(test3)<<endl;
}

运行结果为
16
4
16
好像看来引用是占内存的。。
可是真实这样吗?。。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值