Doodly IT
[Go 묘공단 스터디] 구조체 본문
1) 구조체란
여러 변수를 묶어서 하나의 구조체로 만드는 것을 구조체라고 한다.
구조체의 정의는 다음과 같이한다.
type User struct{
변수들...
}
예를 들어 사용자에 대한 정보를 구조체로 만들면 아래와 같다.
type User Struct {
Age int
Name string
Gender bool
PhoneNum string
}
2) 구조체도 구조체를 포함할 수 있다.
예를 들어 좌표에 따라 값을 설정해야하는 예제라면 Point 구조체를 만들고 Value라는 구조체에 각각 x,y좌표를 다시 선언할 필요없이 Point를 쓰면 된다.
type Point struct{
x int
y int
}
type Value struct{
point Point
value int
}
3) 구조체의 크기와 배치
구조체의 크기는 필드안에 변수들의 데이터 타입크기의 합이다. 예를 들어 아래와 같은 구조체가 있을때,
type User struct{
Age int
Score float64
}
int 타입은 8바이트, Score타입 또한 8바이트이기 때문에 구조체 User의 크기는 16바이트가 된다.
type User struct{
Age int32
Score float64
}
해당 구조체의 크기는 Age의 4바이트, Score의 8바이트 총 12바이트 일것같지만 실제로 크기는 16바이트 이다.
분명 데이터 타입의 크기가 바뀌어서 구조체의 크기가 바뀔것같지만 이는 실제 컴퓨터가 데이터를 적재하는 비트 수에 따라 달라지기 때문이다.
예를 들어 64비트 컴퓨터라면, 레지스터가 8바이트라는 뜻이다.
즉 레지스터가 8바이트라는 것은 8바이트의 데이터를 한번에 연산할 수 있다는 것이다.
만약에 레지스터에 값이 아래와 같이 들어있다고 보면,
int형인데도 레지스터의 크기에 맞춰서 들어가지 못하고 연속적으로 레지스터에 적재될 경우 CPU단에서 두 블럭을 읽고 별도로 연산을 해줘야한다. 이는 CPU단에서 연산이 더 추가되기 때문에 효율적이지 못하다.
그래서 레지스터를 할당할때 레지스터 크기에 맞춰서 적재해서 아래와 같이 CPU의 연산이 쉽게 한다.
이를 메모리 패딩이라고 한다.
근데 만약 적재되는 구조체가 아래와 같다면? 적재될때 메모리 패딩에서 레지스터 공간을 낭비하게 된다.
type User struct{
Score float64
Age int32
Number int64
Tall int32
}
그런 이유에서 구조체를 설계할 때는 메모리 패딩을 고려해서 레지스터 크기에 맞게 설계하는 것이 중요하다.
type User struct{
Score float64
Age int32
Tall int32
Number int64
}
그러면 위와 같이 레지스터의 메모리를 아낄 수 있으며 CPU연산에 영향을 주지않는다.
이렇게 메모리 정렬(패딩)에 있어서 엄격한 시스템(임베디드시스템 같은) 에서는 구조체를 설계할때 레지스터의 크기를 고려해야한다.
'프로그래밍 > Go' 카테고리의 다른 글
[Go 묘공단 스터디] 문자열 (1) | 2023.11.22 |
---|---|
[Go 묘공단 스터디] 포인터 (0) | 2023.11.15 |
[Go 묘공단 스터디]배열 (0) | 2023.11.15 |
[Go 묘공단 스터디] for문 (0) | 2023.11.15 |
[Go 묘공단 스터디] Switch문 (0) | 2023.11.14 |