-
Golang: Struct memory 최적화 (구조체 크기)컴퓨터/Go language 2022. 1. 29. 00:27728x90반응형
Struct
같은 primitive 타입 attributes 같지만 크기는 다른 두 구조체
type ComputerBig struct { // 48 bytes IsPowerOn bool Name string Price int64 Memory int64 IsIdle bool Cycle float32 } type ComputerSmall struct { // 40 bytes Name string Price int64 Memory int64 Cycle float32 IsIdle bool IsPowerOn bool }
어디서 이런 차이가 나오는지 궁금해서 찾아봤다. 아마 몇몇 다른 언어에서도 똑같을 것이다.
64bit CPU를 예로 들면 각 데이터를 각 cycle에 8byte씩 저장한다고 한다.
(bool = 1 byte, string = 16 bytes, int64 = 8 bytes, float32 = 4 bytes)
따라서 ComputerBig은 아래처럼 6 cycles을 갖고 남는 공간이 발생함을 알 수 있다. 48 bytes
Cycle 1에서도 Cycle 6처럼
IsPowerOn 다음에 Name Name 빈 공간을 채워주면 좋겠지만 자료 크기가 안맞으면 다음 cycle로 넘어간다고 한다.
그럼 꽉 채워주면 ComputerSmall처럼 된다. 40 bytes
포인터 타입을 갖고 있어도 맞춰주면 된다. pointer는 64비트 기준으로 8 bytes고
Golang에서 interface는 데이터에 포인터 또 itab에 포인터 (메소드 테이블) 총 16 bytes 이다.
당연히 []interface{}는 24bytes (pointer to data + pointer to itab + pointer to array)
단순 몇 bytes 차이지만 궁금해서 알아봤다.
온라인 PlayGround
https://go.dev/play/p/XRaN47vjSUC
728x90'컴퓨터 > Go language' 카테고리의 다른 글
Wails: Go언어를 이용해 크로스 플랫폼 앱 만들기 (0) 2022.06.26 Go언어: Generics 이용하기 (v1.17+) (2) 2021.03.24 Golang: 카카오 챗봇 API 응답 JSON 빌더 헬퍼 모듈 (0) 2021.02.21