免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 22165 | 回复: 23
打印 上一主题 下一主题

[C++] 引用变量占用内存空间吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-30 18:31 |只看该作者 |倒序浏览
本帖最后由 go_hao 于 2011-07-30 18:33 编辑

引用变量占用内存空间吗?它的内存地址就是“别引用的那个变量”呀,难道他自己不占内存吗?

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
        int val1=99;
        int &val2=val1;

        cout << "val1:" << val1 << " address:" << &val1 << endl;
        cout << "val2:" << val2 << " address:" << &val2 << endl;
        return 0;
}


引用变量,就是“被引用变量”的别名,但是,我不理解,它是否占内存呢?
不可能不占内存空间呀,但是如果占内存的话,为何它的内存地址,与被引用的变量是一个地址呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2011-07-30 21:46 |只看该作者
编译好后,引用就没了

论坛徽章:
0
3 [报告]
发表于 2011-07-31 09:57 |只看该作者
引用就是别名,只是另外一个名字让你好识别之类的吧,实际上不占内存的。

论坛徽章:
0
4 [报告]
发表于 2011-07-31 09:58 |只看该作者
主要应该是用于简化一些复杂的变量名之类的吧。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2011-07-31 13:00 |只看该作者
引用不占空间的说法是流传很广的误会…… 造成该误会的原因可能有:

1. 自动变量优化

int是否占用空间?  这个不好说, 但int能sizeof, 能用 & 取到地址(非register)是肯定的。

  1. int f(int x, int y) {
  2.       int xx = x*x;
  3.       int yy = y*y;
  4.       int a = xx + yy;
  5.       return a;
  6. }
复制代码
xx,yy,a是否占空间?  优化开高了也许就不占了, 直接寄存器干活。
x/y是否占空间? 至少i386上 cdecl 调用约定是占的。


2. 无法取得变量本身的地址

sizeof得到的是被引用对象的大小, & 得到的是被引用对象的地址。
因为引用语意的关系, 没办法"直接"获得引用变量本身的大小与地址信息
可能也造成了该误会……


类似Windows下的dll导入机制:

  1. __declspec(dllimport) double x;
复制代码
实际上类似这样的代码

  1. extern double* __imp_x;
  2. #define x (*__imp_x);
复制代码
通过x宏, 没法取得 __imp_x 的大小与地址。
C++没有规定引用如何实现。 但在i386上, cl/gcc/clang实现都类似这样。


3. 绕过语法糖干扰

最简单的方法:

  1. struct X { double& d; };
  2. enum { size = sizeof(X) }; // 该平台上引用大小

  3. double d;
  4. X x = { d };
  5. void* address = &x; // 引用变量的地址

  6. unsigned char representation[sizeof(X)];
  7. memcpy(representation, address, sizeof x); // 可查看引用变量的表示
复制代码
其他还有很多方法阻止编译器优化, 比如参数, 静态变量…… 不过都比结构体复杂。


4. 小结

C++ (印象中)没有详细描述引用变量的实现方式。
但在 i386(cl/gcc/clang) 下, 引用 —— 如同 int —— 是有大小的, 可以用 3 的方式得到
自动变量的空间(无论是否是引用)都有可能被优化。

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
6 [报告]
发表于 2011-07-31 15:37 |只看该作者
不占吧,指针还得留着赋值,引用直接就是别名了

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
7 [报告]
发表于 2011-07-31 21:47 |只看该作者
都有一个作用域吧。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
8 [报告]
发表于 2011-08-02 11:57 |只看该作者
回复 5# OwnWaterloo


    你妹,很久没见你上来了啊.

    以前看过几集《银他妈》,没注意。最近追《银他妈》TV动画,才发现你的头像原来是神乐{:3_185:}

论坛徽章:
0
9 [报告]
发表于 2011-08-02 15:43 |只看该作者
听说不占

论坛徽章:
0
10 [报告]
发表于 2011-08-02 16:40 |只看该作者
占吧。。。做为函数形参的时候。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP