2017-03-05 7 views
3

채널에서 읽을 때 큰 바이트 배열을 저장하기 위해 변수를 선언 할 때 golang에 더 구체적이고 권장 사례에 대한 조언을 요청하므로 중복 질문으로 표시하지 마십시오.golang에서 변수가 루프 나 조건 또는 케이스 범위를 벗어나면 변수는 어떻게됩니까?

이 멍청한 질문에 대해 용서해주십시오.하지만이 질문의 이유는 여러 채널에서 대형 바이트 배열을 읽는 고성능 스트림 소비자를 작성하는 데 가장 좋은 방법이 무엇인지 판단하기위한 호기심에 불과합니다. (조숙 한 최적화가 모든 악의 뿌리이지만, 이것은 더 많은 호기심입니다.) 나는 Chere과 유사한 유사한 senario에 대한 답변을 읽었지 만 가비지 수집 언어이므로 구체적인 답변을 요청하고 있으며 해당 설명서 here은 "정확성 관점에서 볼 때 변수가 어디에 있는지 알 필요가 없습니다. 할당됩니다 ".

내가 채널에서 읽을 수있는 다음과 같은 코드가있는 경우

,

for { 
    select { 
    case msg := <-stream.Messages(): 
    ...snip... 

변수 msg은 case 문의 범위 내이다.

  • case 성명의 범위를 벗어나면 어떻게 될까요? 동일한 기본 함수로 선언되고 크기가 stream이면 큰 바이트 슬라이스가 될 수 있으므로 변수가 힙 또는 스택에 저장되고 힙이 있으면 가비지 수집되거나 스택 포인터가 들어갑니다 그림?
  • 이것은 무한 루프를위한 것이므로 stream의 크기는 큰 바이트 슬라이스이므로 변수를 생성하고 오버 헤드 할 때마다 메모리를 할당하거나 변수를 앞에 선언하고 계속 덮어 쓰지 않으면 안됩니다 매 반복마다, 내가 모르는 쓰레기 수거가 있다면 쓰레기를 줄일 수 있을까?
  • 전혀 신경 쓰지 않아야하나요?

감사합니다.

답변

3

채널 값 유형이 슬라이스 인 경우 변수 msg의 값은 슬라이스 설명자 일 뿐이며 작은 값입니다 (https://blog.golang.org/go-slices-usage-and-internals 참조). 슬라이스가 참조하는 데이터가 포함 된 배열은 슬라이스가 채널에 배치되기 전에 다른 위치에 할당됩니다. 값을 할당 한 함수가 반환 된 후에도 값이 존속해야한다고 가정하면 힙에있게됩니다. 슬라이스의 내용은 채널 수신 작업에 의해 실제로 이동되거나 복사되지 않습니다.

값이 범위를 벗어나거나 다른 값이 할당 된 변수에 도달하면 해당 슬라이스의 배열에 대한 다른 참조가 없다고 가정하면 가비지 수집이 적용됩니다.

최적화가 프로그램의 작동 방식을 알지 못하더라도 도움이 될지 여부는 말하기 어렵습니다.

3

전혀 신경 쓰지 않아야하나요?

번호

(그리고 그것은 당신을 귀찮게하면 :. 프로필)