* TIL/개념: 최대한 공식 문서 & 책을 기반으로 배운 내용을 정리
* 현재 취준생으로 풋내기 개발자가 쓰는 글입니다.
* 그러니 조언과 지적 및 훈수는 언제나 환영입니다! 댓글로 많이 달아주세요!
옛날 글(메모리구조) 정리하다가 이런 것도 있었군 하면서 메모하는 중..
지금 다시 보니 C, C++에 가까운 듯..
왜 메모리 할당 시에 여유 공간을 넣어주는가?
그리고 왜 효율적인가?
바이트 패딩(Byte Padding)
바이트 패딩(Byte Padding)이란 클래스나 구조체를 위한 메모리 할당 시에
바이트를 추가해서 CPU 접근에 부하를 덜어주는 기법이다.
여기서 패딩은
즉, 원래 있던 것도 충분하지만 추가적으로 더 넣어버린다는 뜻이다.
그럼 바이트 패딩은 뭘 추가하려는 걸까? 바로 공간이다.
1byte 짜리 Boolean 형 변수와 4byte 짜리 int 형 변수가 있는 클래스 foo를 생성하여 공간을 힙에 할당을 하려고 한다.
다음과 같은 코드 처럼 말이다.
class Foo
{
val a : Boolean = true
val b : Int = 1
}
fun main()
{
val foo = Foo()
}
그럼 메모리에는 byte에 얼만큼 할당해주는 게 좋을까?
5byte?
아니다. CPU에 따라 다르지만, 32bit CPU를 사용한다면
8byte를 할당해준다. 3byte를 추가적으로 할당해주는 것이다.
그럼 3byte가 사용도 안하고 남게 되는 건데 왜 바이트 패딩을 사용하는가?
이는 바이트 패딩의 정의에도 말했듯 CPU의 접근의 효율성 때문이다.
32bit CPU는 한 번에 4byte, 64bit CPU는 한 번에 8Byte의 공간을 읽을 수 있다.
32비트 CPU를 사용한다고 가정하고 설명하겠다.
다음과 같은 메모리 공간이 있다.
우리는 1byte 짜리 Boolean 형 변수와 4byte 짜리 int 형 변수가 있는 클래스를 할당해야 한다.
여기서 바이트 패딩을 쓰지 않는다고 생각하고 5byte를 할당해보자. 할당한 공간은 파란색으로 표시했다.
이제 CPU에서 foo의 프로퍼티에 접근을 해야 한다. 32비트 CPU는 4byte만큼 접근할 수 있다.
foo의 Boolean형 변수인 a에 접근을 해보자.
시작 주소로 접근 하여 4byte만을 읽은 후 맨 앞의 1byte만을 이용한다. 즉 아무런 문제가 없다.
그럼 Int 형 변수인 b에 접근하고 싶을 때는...?
2번 화살표로 읽었더니 하나 부족하다.. 그래서 한 번 더 접근해야 했다.
결국엔 Boolean과 Int형 변수에 접근하는데 총 3번의 접근이 필요하다.
그렇다면 만약 바이트 패딩을 사용하면 어떻게 될까?
Boolean 에 한 번 접근하고,
다음 값 볼 필요 없이 4byte를 넘어 Int형을 보면 된다.
분명 메모리 공간이 일부 낭비가 되지만, 2번 접근하기 때문에 효율적이다.