檢視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...