Lua2.4 內存分配 mem.c

先看看頭文件裏的定義,定義了一些出錯信息,幾個內存管理接口,和宏。
幾個宏的定義也是用到了內存分配的幾個接口。newvector 在以前的詞法分析裏已經出現了。
幾個接口,看函數名字比較容易看出來它的做用。下面看一下它們各自的實現:

數組

void luaI_free (void *block)
{
  if (block)
  {
    *((int *)block) = -1;  /* to catch errors */
    free(block);
  }
}

釋放內存。設置 -1 的那個地方是爲了捕獲錯誤,改變被釋放內存的第一個地方的內容,以防在釋放內存以後誤用野指針可能帶來其它的莫名其妙的錯誤。

數據結構

void *luaI_malloc (unsigned long size)
{
  void *block = malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

調用 malloc 分配內存,若是分配不成功,出錯。
返回成功分配的內存。

函數

void *luaI_realloc (void *oldblock, unsigned long size)
{
  void *block = oldblock ? realloc(oldblock, (size_t)size) :
                           malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

調用 relloc 分配內存,若是 oldblock 爲空,同 malloc。
分配不成功,則出錯。
返回成功分配的內存。

lua

int luaI_growvector (void **block, unsigned long nelems, int size,
                       char *errormsg, unsigned long limit)
{
  if (nelems >= limit)
    lua_error(errormsg);
  nelems = (nelems == 0) ? 20 : nelems*2;
  if (nelems > limit)
    nelems = limit;
  *block = luaI_realloc(*block, nelems*size);
  return (int) nelems;
}

從新分配數組。內部調用 luaI_realloc 來從新分配內存。
若是須要分配的元素個數大於所限制的內存數,出錯。
若是須要分配的元素個數爲 0,設置其爲 20 個,若是非 0,擴大一倍。
若是須要分配的元素個數大於限制,設置其爲限制數。
調用 luaI_realloc 從新分配內存。
返回實際分配的個數。

debug

void* luaI_buffer (unsigned long size)
{
  static unsigned long buffsize = 0;
  static char* buffer = NULL;
  if (size > buffsize)
    buffer = luaI_realloc(buffer, buffsize=size);
  return buffer;
}

分配一個緩衝區 buffer,內部調用 luaI_realloc 分配內存。
若是新的 buffer 的 size 小於原來的 buffer size ,什麼也不作,直接返回原來的 buffer.
若是新的 buffer 的 size 大於原來 buffer 的 size,從新分配一個 buffer,返回它。分配內存時調用的依舊是 luaI_realloc。

----------------------------------------
到目前爲止的問題:
lex.c
> lua_createstring 是什麼? TaggedString 是個什麼數據結構?
> luaI_codedebugline 是什麼? 調試相關信息有哪些?

inout.c
> luaI_createfixedstring 是什麼? 那個 TaggedString 是個什麼數據結構?

luac.c
> do_compile 裏的 TFunc 是什麼?那個初始化 luaI_initTFunc 是什麼?
> lua_parser 是什麼? do_dump 方法裏調的那幾個方法又分別是幹什麼的?
----------------------------------------
指針

相關文章
相關標籤/搜索