如何获知一个变量所占的内存变量

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
稍有积蓄, 积分 287, 距离下一级还需 213 积分
论坛徽章:0
本帖最后由 go_hao 于
18:33 编辑
引用变量占用内存空间吗?它的内存地址就是“别引用的那个变量”呀,难道他自己不占内存吗?
#include &stdafx.h&
#include &iostream&
int main(int argc, char* argv[])
& & & & int val1=99;
& & & & int &val2=val1;
& & & & cout && &val1:& && val1 && & address:& && &val1 &&
& & & & cout && &val2:& && val2 && & address:& && &val2 &&
& & & & return 0;
引用变量,就是“被引用变量”的别名,但是,我不理解,它是否占内存呢?
不可能不占内存空间呀,但是如果占内存的话,为何它的内存地址,与被引用的变量是一个地址呢?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
腰缠万贯, 积分 9921, 距离下一级还需 79 积分
论坛徽章:229
编译好后,引用就没了
白手起家, 积分 36, 距离下一级还需 164 积分
论坛徽章:0
引用就是别名,只是另外一个名字让你好识别之类的吧,实际上不占内存的。
白手起家, 积分 36, 距离下一级还需 164 积分
论坛徽章:0
主要应该是用于简化一些复杂的变量名之类的吧。
论坛徽章:2
引用不占空间的说法是流传很广的误会…… 造成该误会的原因可能有:
1. 自动变量优化
int是否占用空间?&&这个不好说, 但int能sizeof, 能用 & 取到地址(非register)是肯定的。
int f(int x, int y) {
& && &int xx = x*x;
& && &int yy = y*y;
& && &int a = xx +
& && &
}
复制代码xx,yy,a是否占空间?&&优化开高了也许就不占了, 直接寄存器干活。
x/y是否占空间? 至少i386上 cdecl 调用约定是占的。
2. 无法取得变量本身的地址
sizeof得到的是被引用对象的大小, & 得到的是被引用对象的地址。
因为引用语意的关系, 没办法&直接&获得引用变量本身的大小与地址信息
可能也造成了该误会……
类似Windows下的dll导入机制:
__declspec(dllimport)
复制代码实际上类似这样的代码
extern double* __imp_x;
#define x (*__imp_x);
复制代码通过x宏, 没法取得 __imp_x 的大小与地址。
C++没有规定引用如何实现。 但在i386上, cl/gcc/clang实现都类似这样。
3. 绕过语法糖干扰
最简单的方法:
struct X { double& };
enum { size = sizeof(X) }; // 该平台上引用大小
X x = { d };
void* address = &x; // 引用变量的地址
unsigned char representation[sizeof(X)];
memcpy(representation, address, sizeof x); // 可查看引用变量的表示
复制代码其他还有很多方法阻止编译器优化, 比如参数, 静态变量…… 不过都比结构体复杂。
C++ (印象中)没有详细描述引用变量的实现方式。
但在 i386(cl/gcc/clang) 下, 引用 —— 如同 int —— 是有大小的, 可以用 3 的方式得到
自动变量的空间(无论是否是引用)都有可能被优化。
丰衣足食, 积分 942, 距离下一级还需 58 积分
论坛徽章:2
不占吧,指针还得留着赋值,引用直接就是别名了
富足长乐, 积分 5144, 距离下一级还需 2856 积分
论坛徽章:1
都有一个作用域吧。
小富即安, 积分 2540, 距离下一级还需 2460 积分
论坛徽章:2
OwnWaterloo
& & 你妹,很久没见你上来了啊.
& & 以前看过几集《银他妈》,没注意。最近追《银他妈》TV动画,才发现你的头像原来是神乐{:3_185:}
白手起家, 积分 10, 距离下一级还需 190 积分
论坛徽章:0
家境小康, 积分 1930, 距离下一级还需 70 积分
论坛徽章:0
占吧。。。做为函数形参的时候。。。小木虫 --- 600万学术达人喜爱的学术科研平台
热门搜索:
&&如何知道一个MATLAB程序在计算中占的内存是多大?谢谢!
如何知道一个MATLAB程序在计算中占的内存是多大?谢谢!
如何知道一个MATLAB程序在计算机中占的内存是多大,怎么看?谢谢!
自己怎么估计?我想知道。
学术必备与600万学术达人在线互动!
扫描下载送金币&&by &karottc
分析一下&C++&里面的引用类型(例如:&int &r = &)中的&r&变量是否占用内存空间呢?是否和&&int *p = &a;&&中的&p&变量一样占用内存空间呢?
本文将给出答案。
直接看一个简单的例子:
#include &iostream&
using namespace
int main(void)
int a = 6;
int *p = &a;
接着我们通过&&g++ testref.cpp -o testref -g&&来编译之后,用gdb来加载它,看看&a,&r,&p,&x&的地址分别是多少:
上图中&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&得到的结果如下:
06cd &main&:
c7 45 e8 06 00 00 00
$0x6,-0x18(%rbp)
# int a = 6; a的地址 0x18
48 8d 45 e8
-0x18(%rbp),%rax
48 89 45 f0
%rax,-0x10(%rbp)
# int &r = r的地址 0x10
48 8d 45 e8
-0x18(%rbp),%rax
48 89 45 f8
%rax,-0x8(%rbp)
# int *p = &a; p的地址 0x8
48 8b 45 f0
-0x10(%rbp),%rax
# 下面两行是为了后面的赋值做准备
(%rax),%eax
%eax,-0x14(%rbp)
x的地址 0x14
b8 00 00 00 00
我把对应处,都写在上面的注释里了。
所以,现在可以得到结论:引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。&从上面的汇编代码可以看出,虽然引用是一个对象的别名,但是在汇编层面,和指针是一样的。
【本文首发于:】
阅读(...) 评论()2008年10月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。2011年2月 C/C++大版内专家分月排行榜第二2010年2月 C/C++大版内专家分月排行榜第二2009年12月 C/C++大版内专家分月排行榜第二2009年11月 C/C++大版内专家分月排行榜第二
2009年10月 C/C++大版内专家分月排行榜第三
2009年9月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 matlab 变量占用内存 的文章

 

随机推荐