2012-09-30 3 views
6

나는 이것을 읽으려고 애썼지 만 그것에 대해 언급 할 수는 없다.F의 "S ..."수명은 무엇입니까?

표준에 따르면, S"로 만든 문자열을 수정할 수 없습니다 수 있으며, 문자열 공간이 사전이나 패드 영역에서 오지 않는 Gforth에서 간단한 실험에서 그것은 분명하다 :

hex 
here . 7F48AB3B8758 ok 
pad . 7F48AB3B8808 ok 
s" test" .s <2> 77FDD0 4 ok 

해당 주소가 얼마나 오래 유효 할 것으로 예상됩니까?

즉,이 주소 (및 개수)를 변수에 저장하면 나중에 프로그램에서 다시 참조 할 수 있습니까? 아니면 사전이나 힙의 별도 위치로 이동해야합니까? 주소를 저장하지 않으면 메모리가 누출됩니까?

답변

7

정의로 컴파일 될 때 문자열의 수명은 정의의 수명입니다. s"은 일반적으로 컴파일시에만 사용됩니다.

Forth는 모두 해석 시간이 s" 인 경우도 있지만 실제로 ANS는 "이 단어에 대한 해석 의미가 정의되지 않았습니다."라고 말합니다. 이 행동은 적어도 당신의 특정한 Forth에만 해당 될 것입니다.

적어도 하나의 해석 시간 문자열에 대해 예약 된 공간이있는 경우 Gforth를 사용하는 것처럼 보입니다. Gforth 설명서에 "문자열은 s"의 다음 호출 때까지만 존재합니다"라고 나와 있습니다. "일부 Forth 시스템은 이러한 문자열 중 하나 이상을 유지하지만 대개 여전히 수명이 제한되어 있습니다." (Section 3.24 Characters and Strings).

도움이 되었기를 바랍니다.

+0

감사합니다. 나는 분명히 그 단락을 놓쳤습니다. 적어도 그것은 그것을 명확하게합니다. – harald

+1

gForth에서 "적어도 하나의 해석 시간 문자열"은 실제로 원하는만큼 의미가 있긴하지만 정확합니다. gForth에서'S '는 해석시에 메모리를 할당하고 거기에 문자열을 복사하고 그것을 결코 해제하지 않습니다. (해석을 위해 괜찮습니다.)'see s "'를 입력 한 다음'save-mem'을 참조하여 이것을 발견했습니다. –