[Go] Struct pointer in Heap

Falcon·2021년 10월 22일
1

go

목록 보기
4/11
post-thumbnail

Goal

class 가 없는 go에서 struct pointer 배열로 인스턴스 배열을 관리한다.

TL;DR;

  • 새 인스턴스 생성시 의심되면 일단 포인터로 반환하라.

  • 슬라이스, 맵, 채널, 문자열, 함수값, 인터페이스 값 까지 내부적으로 모두 포인터로 구현되있다.

  • 특히 큰 구조체에 (함수 내에서 뭔가 바꿀 필요가 있는) 포인터를 사용하라, 아니면 그냥 값을 넘겨라.
    => 변경하지 않을거라면 포인터를 넘기지 마라.

지역변수로 넘겨야해

  1. 메모리 할당비용
    스택이 힙보다 Allocation/Deallocation 비용이 적게들고 즉시 일어난다.
    Go는 가비지 컬렉터가 있다는 사실을 기억하라.

  2. 메모리 지역성 (Locality)
    스택이 힙보다 더 locality 를 갖는다.
    slice 같은 데이터 타입 사용시 그러하다.
    반면에 heap 의 주소는 여기저기 산재해있어 locality 가 떨어진다.

  3. Null pointer check
    포인터로 값을 넘기면 항상 Null pointer check를 해야한다. 그렇지 않으면 panic 으로 프로그램이 중단될 수 있다.


x86 OS에서도 보통 캐시라인은 64bytes 다. 근데 보통 구조체가 64bytes 를 넘는 경우가 잘 없다. 즉, 캐시라인을 카피하는데 드는 시간이 포인터로 넘기나 값으로 넘기나 비슷하다.
이런데 뭐하러 포인터로 넘기나?

📝 요약

when to pass value , reference either

When to usePointerValue
SizeLargeSmall
isMutableMutableImmutable
Data-typeCustomizedPrimitive

🔗 Reference

pointer vs values in parameter or return values - stackoverflow

profile
I'm still hungry

0개의 댓글