美文网首页
lua表引用的本质

lua表引用的本质

作者: 奋斗中的菜鸡 | 来源:发表于2018-07-25 14:33 被阅读0次

之前写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本身产生什么影响,当然引用数除外,
不过这个不在我们此次的讨论范围

第一次写文章,如果文章有不妥的地方,欢迎大家指正

相关文章

  • lua表引用的本质

    之前写lua代码引用lua表的时候有一些疑问,大致代码是这样的 这里的输出意料之中,因为表传的是引用所以我们改变b...

  • lua弱引用 使用注意

    lua的弱引用 使用 lua弱引用一般是通过table来实现的 如:locala={} setmetatable(...

  • 2018-05-07

    引用 左值引用 右值引用 引用本质 引用指针 int & 引用整数 本质指针int && 引用整数 本质指针 ...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • 学习常用链接

    //Lua Lua table详解 Lua 元表详解 云风博客 //Unity Unity知识点 栈和队列 Uni...

  • Lua实现继承的方法

    lua通过元表实现继承 lua查找一个表元素的规则如下 1.在表中查找,如果找到,则返回这个元素 2.判断该表是否...

  • lua脚本实现redis当当前值等于期望值时删除key

    1、lua脚本cad.lua 2、RedisLuaUtil.java1)直接在代码中写lua脚本字符串 2)引用l...

  • lua格式化字符串string.format

    引用lua的官方文档: string.format (formatstring, ···)## Returns a...

  • Lua 元表(Metatable)

    学习网站Lua 元表(Metatable)

  • Lua中元表的学习

    Lua本身没有面向对象的思想,但是可以根据表、元表、元方法来靠近它 一、元表与元方法的概念Lua中每个值都可具有元...

网友评论

      本文标题:lua表引用的本质

      本文链接:https://www.haomeiwen.com/subject/efupmftx.html