2010-05-18 3 views
1

두 개의 문자열로 된 매우 간단한 루아 함수를 호출하고자하는 C 프로그램이 있다고 가정 해 보겠습니다. 두 개의 쉼표로 구분 된 목록을 말하며, 목록이 전혀 교차하지 않으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.루아에서 문자열 복사 피하기

확실한 방법은 lua_pushstring으로 스택에 푸시하는 것입니다. 그러나 문서에서 lua_pushstring처럼 보이지만 루아의 문자열 복사본을 사용합니다.

즉, Lua 함수로 건너 뛰려면 C에서 Lua 함수를 다시 작성하여 피할 수있는 두 개의 문자열 복사본이 필요합니다. 기존 C 문자열을 다시 사용할 수 있도록 배치하는 방법이 있습니까? 성능을 위해 루아 측 (또는 strcpy 비용 창백함은 어쨌든 중요하지 않음)?

지금까지 (루아를 진지하게 바라 보는 처음 몇 시간) 나의 조사에서, lite userdata은 내가 원하는 것처럼 보이지만 문자열의 형태로 보인다.

답변

5

아니요. lua_pushstring()으로 전화하면 루아가 문자열 사본을 만들 수 없습니다.

이유 : 내부 garbage collector은 사용하지 않은 메모리 (사용자 입력 문자열 2 개)를 확보 할 수 없다면 말입니다.

가벼운 사용자 데이터 기능 (이 경우 잔인 함)을 사용하는 경우에도 Lua 프로그램이 문자열을 묻는 경우 나중에 lua_pushstring()을 사용해야합니다.

1

Hmm .. C 언어에서 작업을 수행 할 수 있도록 일부 C 함수를 작성할 수 있지만 다른 답변이 가리키는 것처럼 어쨌든 문자열이나 섹션을 밀어 붙일 수 있습니다.

참고 : 루아는 가져 왔을 때 문자열을 한 번만 저장합니다. 즉 : "빠른 여우가 게으른 개로 점프합니다"라는 문자열이 하나 있고 루아에 밀어 넣으면 다른 문자열이 없습니다. 해당 문자열을 포함하는 객체는 새로운 사본을 만듭니다. 반면에 이미 삽입했다면 첫 번째 문자열에 대한 포인터를 얻으므로 평등 검사가 매우 저렴합니다. 이러한 문자열을 가져 오는 것은 약간 비쌀 수 있습니다. 그러나 이것이 고 빈도로 수행되는 경우에는 비교가 저렴합니다.

실적이 기대에 부합하는지 여부를 확인하고 구현하고자하는 프로파일을 시도해 보겠습니다. 최적화 관련 (당신이 루아의 성능을 극대화 대해 생각하면 내가 읽어 보시기 바랍니다)에 Lua Performance Tips 문서로

, 두 개의 프로그래밍 격언은 다음과 같습니다

규칙 # 1 : 그것을하지 마십시오.

규칙 # 2 : 아직하지 마십시오. (전문가 만 해당)

관련 문제