
之前写lua代码引用lua表的时候有一些疑问,大致代码是这样的
local a = {1,2,3,4,5}
local b = a
b[2] = 100
for k,v in pairs(a) do
print(k,v)
end
这里的输出意料之中,因为表传的是引用所以我们改变b也导致了a表里面的相应的变化
1 1
2 100
3 3
4 4
5 5
接下来就是我一直疑惑的地方,我们修改下代码
local a = {1,2,3,4,5}
local b = a
print("---------a,b的地址",a,b)
a = nil
print("---------a,b的地址",a,b)
这段输出是这样的
---------a,b的地址 table: 0x1915eb0 table: 0x1915eb0
---------a,b的地址 nil table: 0x1915eb0
在这里我们可以看到第一次输出a,b的地址是相同的,因为同为引用一个表,所以这个也没有疑惑
疑惑的就是我把a表赋空之后,b并不为空
我在网上查了一些大神关于引用的本质介绍的之后,大致明白了这样的原因,主要是我没有把指针和引用之间的区别搞清楚
下面是网上c++大神关于引用本质的介绍
int a = 10;
int &b = a;
这里,显然,b是一个引用。
语句“int a = 10;”,在内存中申请了一个int型变量,
32位机中占4个字节,那么变量名a放哪里了呢,有些人可能会有这个疑问。
其实a代表的是一个内存地址,you know,计算机访问内存中的据,全部是
通过地址进行访问(这个结论你可以从《汇编》的寻址方式中得出)。
在编译器将你的代码生成目标文件时,它会用这个地址替代所有的a,
因此目标文件中也就没有变量名a了,所以,变量名a不会占用内存也就理
所当然了。
那么,引用 b会不会占内存空间呢?由于受大学课本的影响(引用b只是a
的别名,b其实就是a本身),我很自然的会想到,b跟a一样,在编译后,所有
的b也都用a的这个地址去替代,所以b也不会占用任何内存空间。前段时间,
这个问题在快速入门群和高级专业群中各位朋友讨论了一下,大家也众说纷纭。
在网上也搜到很多帖子,说引用只是一个别名,它不会占用空间。
BUT,与各位高手的交流,查看众多网站,
最后得出的结论是:
引用的本质是指针,而且是常量指针,
占用4个字节的空间也就是说,“int &b = a;”会开辟一块4个字节的空间,
用于存放那个地址,当然,变量名b不会占用空间。
如果你听糊涂了,没关系,记住一条:
引用b,本质就是一个常量指针(当然使用时不同)
看完这个之后我觉得我们之前写的代码:
local a = {1,2,3,4,5}
local b = a
print("---------a,b的地址",a,b)
a = nil
print("---------a,b的地址",a,b)
结论:
a,b只是地址为table: 0x1915eb0的表的别名,
不管我们释放a或者是b,只是对a或者b的常量指针的释放。
并不对表table: 0x1915eb0本身产生什么影响,当然引用数除外,
不过这个不在我们此次的讨论范围
第一次写文章,如果文章有不妥的地方,欢迎大家指正
网友评论