C C 如何給快速呼叫Lua中定義的函式

2021-10-08 07:14:37 字數 1728 閱讀 8391

要想在c中呼叫lua中的函式,按照之前方法,需要先找到函式所在的位置。於是我們需要呼叫 lua_getglobal這個函式,而實際上lua_getglobal這個函式又是如何找到name所在的位置呢?

我們先看這個函式的實現

lua_api int lua_getglobal

(lua_state *l,

const char *name)

繼續跟進會看到調了auxgetstr這個函式

/*

** get functions (lua -> stack)

*/static int auxgetstr

(lua_state *l,

const tvalue *t,

const char *k)

else

lua_unlock(l

);return

ttnov(l

->top -1)

;}

再看到luah_getstr這個函式

const tvalue *

luah_getstr

(table *t, tstring *key)

}

繼續往下看luah_getshortstr這個函式

/*

** search function for short strings

*/const tvalue *

luah_getshortstr

(table *t, tstring *key)

}}

終於我們知道了lua怎麼找到name的了,就是for迴圈。當定義的函式很少時,不會產生什麼呼叫延遲,但是如果定義的函式很多的時候,我們每次呼叫都需要遍歷去查詢,那麼速度一下子就降下來了。那麼我們如何增加查詢的速度呢?

lua給了我們lual_ref和lua_rawgeti這兩個函式來快速的註冊和查詢函式

我們現在lua中定義這個函式

function

startsearch

(start,end)

......

return

100end

在c中先找到他並把它註冊進lua的ref中

lua_getglobal(l

,"startsearch");

// 獲取函式,壓入棧中

int ref =

lual_ref(l

,lua_registryindex

);

之後的呼叫只需要使用ref就行了

lua_rawgeti(l

,lua_registryindex

,ref)

;lua_pushinteger(l

,(long)

267000000);

// 壓入第乙個引數

lua_pushinteger(l

,(long)

111000000);

// 壓入第二個引數

int iret =

lua_pcall(l

,2,1

,0);

// 呼叫函式,呼叫完成以後,會將返回值壓入棧中,2表示引數個數,1表示返回結果個數。

if(iret)

// 呼叫出錯

C C 中如何呼叫Python方法

c c 對python的呼叫層次可以分為三個層次,1 高層次的呼叫,2 純python呼叫,3 python方法的擴充套件 也就使向python輸出呼叫函式 這裡我主要討論 1 和 2 兩種方法.1 高層次的呼叫 這是最簡單的一種在c c 中呼叫python的方法.它直接的呼叫python提供的c呼...

快速掌握Lua 5 3 從Lua中呼叫C函式

a 1 程式主體在c中執行,c函式註冊到lua中。c呼叫lua,lua呼叫c註冊的函式,c得到函式的執行結果。2 程式主體在lua中執行,c函式作為庫函式供lua使用。第一種方式看起來很羅嗦,也很奇怪。既然程式主體執行在c中,而且最終使用的也是c中定義的函式,那麼為何要將函式註冊給lua,然後再通過...

C C 中關於main函式的呼叫和定義形式

在c和c 中是不同的,我們知道c語言比較寬鬆 靈活,而c 的目標就是改變c語言比較寬鬆的特點,實行了比較嚴格的做法,包括嚴格的型別檢查等等。實際上,在c語言中,main函式可被遞迴呼叫,而在c 標準中,main函式不可以被遞迴呼叫。這當然也不是標準 c c 裡面定義的東西!char envp 是某些...