Go(golang) 구조체(struct)

 안녕하세요. 이번에는 golang의 구조체에 대해서 알아보겠습니다. 


사진1) 구조체 선언

사진1과 같이 타입을 선언할수 있습니다.

1) 타입 선언

2) 선언할 타입의 이름

3) 구조체 선언

4) 해당 구조체의 원소 타입 선언



package main

import (
"fmt"
"unsafe"
)

// 학생 타입 선언
type Student struct {
age int32 // 4 byte
name string // 16 byte
}

// 학점 타입 선언
type Grade struct {
student Student
score float32
year uint8
}

func main(){

// 타입을 이용여 변수 선언 및 age, name 할당
var stu1 Student = Student{
32,
"alex",
}

// 64비트 운영체제의 실제 stu1 구조체(struct)의 크기를 측정할때 20byte가 아닌 24byte로 출력된다.
fmt.Println(unsafe.Sizeof(stu1))

// 타입을 이용하여 stu1Grade를 Grade타입으로 선언하고 원소값 할당
var stu1Grade Grade = Grade{
stu1,
100,
2,
}

// stu1에서 name과 age를 각각 출력
fmt.Println("stu1출력 :",stu1.name, stu1.age)
// stu1Grade에서 name과 age를 각각 출력
fmt.Println("stu1Grade 출력 :",stu1Grade.student.name, stu1Grade.student.age)
}

코드1) struct 크기


사진2) struct 메모리 할당


그런데 코드1에서 Student타입의 크기는 24byte로 출력 되었습니다. 이는 운영체제가 32bit, 64bit에 따라 달라집니다. 64bit는 한번에 8byte를 계산할수 있기 때문에 한번 변수를 할당할때 8byte의 배수로 할당합니다.


package main

import (
"fmt"
"unsafe"
)

// 64bit OS에 Struct 타입 선언
type TestStruct struct {
Alpa1 int8 // 1byte
Alpa2 int // 8byte(int64)
Alpa3 int8 // 1byte
Alpa4 int // 8byte(int64)
}

func main(){

// 변수 선언
var test TestStruct = TestStruct{
1,
2,
3,
4,
}

// 해당 크기는 18byte가 아닌32byte가 출력된다.
fmt.Println("Size of struct :", unsafe.Sizeof(test))
}
코드2) struct 크기 테스트




사진3) 실제 할당된 메모리


위 코드2는 효율적이지 못한 struct구조 입니다. 각각 1byte인 'Alpa1', 'Alpa3'이 따로 떨어져 있어 사용하지 못하는 메모리가 14byte나 생겼습니다. 이때 순서를 잘 이용하면 메모리 사용량을 상당히 줄일수 있습니다.


package main

import (
"fmt"
"unsafe"
)

// 64bit OS에 Struct 타입 선언
type TestStruct struct {
Alpa2 int // 8byte(int64)
Alpa4 int // 8byte(int64)
Alpa1 int8 // 1byte
Alpa3 int8 // 1byte
}

func main(){

// 변수 선언
var test TestStruct = TestStruct{
1,
2,
3,
4,
}

// 해당 크기는 24byte가 출력된다.
fmt.Println("Size of struct :", unsafe.Sizeof(test))
}
코드3) 효율적인 struct 크기 테스트




사진4) 코드6의 실제 메모리 할당


코드3을 실행하면 코드2에서의 32byte가 아닌 24byte가 측정된다. 이는 사진4와 같이 golang에서 최대한 8byte에 넣으려고 노력하기 때문이다.






댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)