C 함수 에 저장 상태: registry, reference, upvalues
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 가 같은 시 계 를 가리 키 도록 설정 할 수 있 습 니 다. 그러면 이 시 계 는 모든 함수 가 데 이 터 를 공유 하 는 곳 이 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javascript Primitive type vs Reference type (원시자료형 vs 참조자료형)?? 뭔데??Javascript 자료형은 크게 두 가지 데이터 타입으로 나뉜다!! 그것이 오늘 공부한 Primitive와 Reference type이다 => 두 타입 모두 선언, 할당 과정을 거친다는 점에서는 동일하다. 원시자료...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.