我想知道是否可以通過引用來傳遞元表,並且當您想要爲多個表使用相同的元表時,在setmetatable()
中聲明它是內聯的。
我的目標是節省內存,但前提是它確實會產生顯着差異。設置元表:參考vs內聯的優勢?
什麼我說的是這樣的:
-- Passing the meta table by reference:
JSON1 = {
metaTable = {
__index = function (t, k)
-- ...
end;
__call = function()
-- ...
end
};
parse = function(filePath)
local fakeParsedJson = {}
setmetatable(fakeParsedJson, JSON1.metaTable) -- Right here
return fakeParsedJson(filePath)
end;
}
VS
-- Passing the table in-line:
JSON2 = {
parse = function(filePath)
local fakeParsedJson = {}
setmetatable(fakeParsedJson, { -- Right here:
__index = function (t, k)
-- ...
end;
__call = function()
-- ...
end
})
return fakeParsedJson(filePath)
end;
}
我試圖找出是否存在內存使用量的顯著差異,但只有這樣,我可以找到比較的gcinfo:
local start1 = gcinfo()
local example2_1 = JSON2.parse('example2_1.json')
local example2_2 = JSON2.parse('example2_2.json')
local example2_3 = JSON2.parse('example2_3.json')
local example2_4 = JSON2.parse('example2_4.json')
local example2_5 = JSON2.parse('example2_5.json')
print(gcinfo()-start1) -- Prints 1
local start2 = gcinfo()
local example1_1 = JSON1.parse('example1_1.json')
local example1_2 = JSON1.parse('example1_2.json')
local example1_3 = JSON1.parse('example1_3.json')
local example1_4 = JSON1.parse('example1_4.json')
local example1_5 = JSON1.parse('example1_5.json')
print(gcinfo()-start2) -- Prints 1
她e是我的小提琴:https://repl.it/HfwS/34
它看起來並不像是有區別的。但我只是不知道底下實際發生了什麼。
當您撥打setmetatable(myTable,myMetaTable)
時,會在myTable
的某處寫入myMetaTable
的完整副本嗎?還是隻會存儲一個簡單的參考?因爲如果它只是存儲一個引用,那麼將所有表指向同一個元表是非常有意義的。
雖然,我覺得這並沒有真正回答這個問題。一個更大的元表會佔用更多的內存,顯然是的。但是我在詢問setmetatable()以及是否通過引用或內聯傳遞元表時存在顯着差異。 – Forivin
它確實回答了這個問題(「是的,爲所有東西創建新的表格都會吃更多的內存」),但是似乎還有一些關於你還沒有理解的Lua的語義。所以我根據猜測可能會擴大答案。這有幫助嗎? – nobody
(代碼中的註釋顯示相同的「思考錯誤」 - 它應該是「通過引用傳遞元表」與「**創建**內嵌表」(而不是「傳遞...內嵌」)。 )如果你現在明白爲什麼,你的問題應該回答自己。) – nobody