——by  karottc

分析一下 C++ 里面的引用类型(例如: int &r = a;  )中的 r 变量是否占用内存空间呢?是否和  int *p = &a;  中的 p 变量一样占用内存空间呢?

本文将给出答案。

直接看一个简单的例子:

#include <iostream>

using namespace std;

int main(void)
{
int a = ;
int &r = a;
int *p = &a;
int x = r;
return ;
}

接着我们通过  g++ testref.cpp -o testref -g  来编译之后,用gdb来加载它,看看 arpx 的地址分别是多少:


上图中 a 的地址为 0x7fffffffe208,用取地址符去获取 r 地址,值和 a 是一样的,其实,用 & 符号是不能获取到引用类型变量的地址的,因为引用类型的变量本身只是另一个对象的别名,用可感知的方式描述,就是它仅仅是一个名字而已,对它的任何操作都是相当于对另一个对象的操作,所以这个取地址操作也是一样。

但是,我们接着往下看,p 的地址是 0x7fffffffe218,和 a 的地址刚刚相差了 16 字节,接着看 x 的地址是0x7fffffffe20c,这个地址正好是 a的地址 0x7fffffffe208 + 4, 而 a 是 int 型,变量本身占用 4 字节,正常情况下, x 的地址应该是 p 的地址 0x7fffffffe218 + 8,这里 +8 是因为我的机器是 64 位的机器,所以指针类型占用 8 字节。现在这种情况应该是编译器做了优化,把 x 的放到了 a 的后面,同样的,x 的下一个变量的起始地址应该是 0x7fffffffe20c + 4 =0x7fffffffe210,这个地址和 p 之间刚好差了 8 个字节,也就是一个指针变量的地址,所以答案就很明显了。

即,我们现在可以猜测,r 是占用内存空间,并且占用的大小和指针变量相同大小。但是我们上面用gdb也看不了 r 的实际地址,所以这也只能是猜测,只是看似合理的猜测而已。

为了证明这个猜测,我们继续把可执行文件反汇编出来看看:objdump -d testref 得到的结果如下:

00000000004006cd <main>:
4006cd: push %rbp
4006ce: e5 mov %rsp,%rbp
4006d1: c7 e8 movl $0x6,-0x18(%rbp) # int a = ; a的地址 0x18
4006d8: 8d e8 lea -0x18(%rbp),%rax
4006dc: f0 mov %rax,-0x10(%rbp) # int &r = a; r的地址 0x10
4006e0: 8d e8 lea -0x18(%rbp),%rax
4006e4: f8 mov %rax,-0x8(%rbp) # int *p = &a; p的地址 0x8
4006e8: 8b f0 mov -0x10(%rbp),%rax # 下面两行是为了后面的赋值做准备
4006ec: 8b mov (%rax),%eax
4006ee: ec mov %eax,-0x14(%rbp) # int x = r; x的地址 0x14
4006f1: b8 mov $0x0,%eax
4006f6: 5d pop %rbp
4006f7: c3 retq

我把对应处,都写在上面的注释里了。

所以,现在可以得到结论:引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。 从上面的汇编代码可以看出,虽然引用是一个对象的别名,但是在汇编层面,和指针是一样的。

【本文首发于:http://www.karottc.com/blog/2015/07/29/cpp-reference/

2015.07.29

C++的引用类型的变量到底占不占用内存空间?的更多相关文章

  1. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  2. 一个Java对象到底占多大内存

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  3. 一个Java对象到底占多大内存?(转)

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  4. 【转】一个Java对象到底占多大内存?

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  5. Visual Studio 2017 如何 监控当前变量 占用内存空间大小

    在进行VS调试时 大家是否想知道当前变量 占用了内存多少空间呢 这对系统调优还是很有帮助的吧

  6. C++中class在实例化前到底占用多少空间

    最近忽然想起一个问题,C++中class在实例化前到底占用多少空间?我隐约记得书上是这么说的“类在实例化时才分配空间”!但是当我写下这个小程序的时候,杯具产生了—— #include<iostr ...

  7. Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!

    写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...

  8. C++中的类所占内存空间总结

    C++中的类所占内存空间总结    最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...

  9. C++中的类所占内存空间总结(转)

    类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调 ...

随机推荐

  1. Eclipse 插件 —— RunJettyRun 的下载、安装与使用

    关于 Jetty 与 Eclipse 的集成,网上很多都是使用 Eclipse 的一个自动安装功能 —— Software Update.个人不太喜欢这种方式.这种安装方式有点问题:第一,需要网络流畅 ...

  2. html5 移动端单页面布局

    序     移动端的web网页使用的是响应式设计,但一般我们看到的网站页面都是跳转刷新得到的,比如通过点击一个menu后进入到另一个页面 今天来说下是移动端的单页面的布局.单页面就是一切操作和布局都是 ...

  3. hibernate学习笔记6--Criteria查询方式、完整小练习(开发步骤)

    一.Criteria查询方式没有sql语了,因此更加面向对象一些.Criteria是一种比HQL更面向对象的查询方式:Criteria的创建方式: Criteria c = s.createCrite ...

  4. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  5. vmware装redhat该光盘无法被挂载

    为了考网工,没办法只能学学linux了,前天在vmware7装redhat 提示该光盘无法被挂载,还以为是光盘错误,换了N个盘,又装了很多次,最后观察到,换了盘之后点确定,里面就提示该光盘无法被挂载, ...

  6. XE4 IOS开发环境配置

    l 配置IOS的安装开发环境 使用RAD XE4开发IOS程序,一台MAC是必须的(也可以用虚拟机), MAC上需要安装Xcode, 独立版本的Commnand Line Tools 以及RAD的pa ...

  7. gcc与g++

    gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为 ...

  8. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. 深入理解 AngularJS 的 Scope(转)

    一.遇到的问题 问题发生在使用 AngularJS 嵌套 Controller 的时候.因为每个 Controller 都有它对应的 Scope(相当于作用域.控制范围),所以 Controller ...

  10. php使用第三方登录

    目前只做了微博和qq的,前面的去connect.qq.com,open.weibo.com注册的步骤省略 qq和weibo站点都有可以现在的php版本的api,qq的api相对高大上一些. <s ...