C 함수 에 저장 상태: registry, reference, upvalues

C 함 수 는 스 택 을 통 해 Lua 와 데 이 터 를 교환 할 수 있 지만 가끔 C 함 수 는 함수 체 의 역할 영역 외 에 일부 Lua 데 이 터 를 저장 해 야 합 니 다. 그러면 우 리 는 전체 변수 나 static 변 수 를 생각 합 니 다. 이렇게 하 는 단점 은 (1) Lua 를 위해 C 함수 라 이브 러 리 를 설계 할 때 다시 들 어 갈 수 없다 는 것 입 니 다.(2) 모든 Lua 값 이 C 변수 에 잘 저장 되 는 것 은 아 닙 니 다.Lua 전역 변수 에 값 을 저장 할 수 있 습 니까? 네, Lua 는 registry 라 고 불 리 는 독립 된 표를 제공 하지만 Lua 코드 자체 에 접근 할 수 없습니다.
1. registry 전역 레 지 스 트 리
설명: 일반적인 Lua 표, 가짜 색인 (pseudo - index) LUA 사용REGISTRYINDEX 방문.C 코드 는 접근 할 수 있 고 Lua 코드 는 접근 할 수 없습니다.
용도: C 함수 가 전역 Lua 값 을 유지 하 는 문 제 를 해결 합 니 다.
메모: 모든 C 라 이브 러 리 는 같은 registry 를 공유 하기 때문에 key 의 이름 에 대해 서 는 전역 적 으로 유일 해 야 합 니 다.
    //   registry   "KEY"       :
    lua_pushstring(L, "KEY");
    lua_gettable(L, LUA_REGISTRYINDEX);

2. reference 참조 시스템
설명: 하나의 정 수 를 통 해 하나의 Lua 데이터 대상 을 유일 하 게 표시 하고 두 함수 luaLref 와 luaLunref 구성, 이 함 수 는 이름 충돌 을 걱정 하지 않 아 도 되 는 값 을 registry 에 저장 합 니 다.
용도: Lua 값 을 가리 키 는 reference 를 C 구조 체 에 저장 합 니 다. 이 reference 는 int 의 KEY 입 니 다.
메모: 스 택 정상 값 이 nil 일 때 reference, luaL 가 발생 하지 않 습 니 다.ref 함 수 는 LUA 로 돌아 갑 니 다.REFNIL, LUAREFNIL 해 인용 은 효과 가 없습니다.
중요 함수:
int luaL_ref (lua_State *L, int t);
참조 reference 를 만 들 고 되 돌려 주 며 [reference, 스 택 정상 값 v] 를 t 에 대응 하 는 표 에 추가 합 니 다.
void luaL_unref (lua_State *L, int t, int ref);
인용 을 풀 고 t 에 대응 하 는 표 의 [reference, v] 키 값 을 삭제 합 니 다.
    //      v      ,  [r, v]  LUA_REGISTRYINDEX  
    int r = luaL_ref(L, LUA_REGISTRYINDEX);
    //         
    lua_rawgeti(L, LUA_REGISTRYINDEX, r);
    //    ,   reference  
    luaL_unref(L, LUA_REGISTRYINDEX, r);

3. upvalues 메커니즘
설명: C 함 수 를 만 들 때 값 을 연결 할 수 있 습 니 다. 그러면 C 패 킷 을 만 들 었 습 니 다. 이 관련 값 을 upvalues 라 고 합 니 다.
용도: C static 변수 와 등가 라 는 개념 을 실현 하 였 으 며, 이러한 변 수 는 특정한 함수 에서 만 볼 수 있 습 니 다.
사용처: luaupvalueindex (n) 에서 가짜 인덱스 를 생 성하 여 접근 합 니 다.
    //    
    static int counter (lua_State *L);
    //   C       
    int newCounter (lua_State *L)
    {
        lua_pushnumber(L, 0);
        lua_pushcclosure(L, &counter, 1);
        return 1;
    }
    // C  
    static int counter (lua_State *L)
    {
        double val = lua_tonumber(L, lua_upvalueindex(1));
        lua_pushnumber(L, ++val);   /* new value */
        lua_pushvalue(L, -1);       /* duplicate it */
        lua_replace(L, lua_upvalueindex(1));  /* update upvalue */
        return 1;  /* return new value */
    }

메모: registry 의 key 로 숫자 를 영원히 사용 하지 마 십시오. 이러한 유형의 key 는 reference 시스템 에 사용 되 기 때 문 입 니 다.
가짜 인덱스 (pseudo - index) 의 특징: (1) 대응 하 는 값 은 창고 에 없습니다.(2) 사용 방식 은 스 택 색인 과 유사 하 며 대부분 색인 을 매개 변수 로 받 아들 이 는 함수 가 사용 할 수 있 습 니 다.(3) 스 택 자체 의 함수 들 은 가짜 색인 을 사용 할 수 없습니다. 예 를 들 어 luaremove,lua_insert 등.
Lua 패 킷 (Lua 코드 에서 하나의 패 킷 은 외부 함수 에서 부분 변 수 를 방문 하 는 함수) 과 달리 C 패 킷 은 upvalues 를 공유 할 수 없습니다. 모든 패 킷 은 독립 된 변수 집합 이 있 습 니 다.그러나 우 리 는 서로 다른 함수 의 upvalues 가 같은 시 계 를 가리 키 도록 설정 할 수 있 습 니 다. 그러면 이 시 계 는 모든 함수 가 데 이 터 를 공유 하 는 곳 이 됩 니 다.

좋은 웹페이지 즐겨찾기