估算lua記憶體大小

2021-09-02 19:26:06 字數 1878 閱讀 9090

檢視lua占用記憶體大小

想要獲取lua元素的size,無法直接使用sizeof,需要使用collectgarbage

local function getmem()

return collectgarbage("count")

endcollectgarbage("stop")

local before = getmem()

local a = {}

local after = getmem()

print("using mem「, (after-before)*1024)

lua5.1.4 輸出結果:using mem, 32

lua table占用記憶體分析

也就是說乙個空的table占用記憶體大小32bit。接下來我們看看空table的資料結構:

lobject.h 338

typedef struct table table;
lobject.h 43

#define commonheader   gcobject* next; lu_byte tt; lu_byte marked;
llimits.h 27

typedef unsigned char lu_byte;
lua table arraylist占用記憶體分析

local a =占用記憶體是多少?48bit

a的大小 = {} + 0,{}=32bit,0在table中放在tvalue *array中,所以tvalue的大小是我們要關注的。檢視lua中關於tvalue的定義:

typedef union  value;

#define tvaluefileds value value; int tt

typedef struct lua_tvalue tvalue;

lua_number 是double,所以 sizeof(double) + sizeof(int) = 12bit。考慮到結構體位元組對齊, 結構中占用最大空間的型別所占用的位元組數(sizefo(double)=8)的倍數,最終 sizeof(tvalue) = 16bit

lua table hashmap占用記憶體分析

local a = }占用記憶體是多少? 80bit

element

size

外層table

32tvalue

16內層table

32local a = 占用記憶體是多少?64bit

x=0在table結構體中放置在node *node中,檢視原始碼關於node的定義:

typedef union tkey nk;

tvalue tvk

} tkey;

typedef struct node node;

sizeof(node) = sizeof(tvalue) + sizeof(tkey) = 16 + 16 = 32

sizeof(table) = 32 + n* 16 + 全部陣列元素的size + m*32 + 全部hash部分元素的size

估算的情況下可以認為全部是陣列或者hash

究竟是arraylist還是hashmap?
local a= 

local b =

元素0在a中放在arraylist中,而在b中放在hashmap中。其實lua table在resize的時候會對arraylist和hashmap進行優化,所以陣列有可能在hashmap中儲存。關於這部分內用會在以後專題分析。就估算而言,完全可以認為table中全部為陣列或者hashmap。

enum的記憶體大小

enum在記憶體中占用多少儲存空間,為什麼在使用enum型別的時候不用寫上enum的名字呢,想struct一樣呼叫?在網上搜尋了一下,找到了想要的結論!enum定義類似與下面這樣 enum color 用起來可能像這樣 color color red switch color 先說為什麼red,不能...

類記憶體大小分析

include using namespace std class test int main 這是因為空類也可以被例項化,但是例項化的物件必須要有記憶體位址,所以空類會被加入乙個位元組,用來得到例項化的記憶體位址。include using namespace std class test int...

檢視linux記憶體大小

用free m檢視的結果 free m total used free shared buffers cached mem 504 471 32 0 19 269 buffers cache 183 321 swap 996 0 996 檢視 proc kcore檔案的大小 ll h proc kc...