Bibbidi Bobbidi Boo
article thumbnail
Published 2023. 6. 6. 01:46
[TIL/개념] 바이트 패딩 etc

* TIL/개념: 최대한 공식 문서 & 책을 기반으로 배운 내용을 정리

* 현재 취준생으로 풋내기 개발자가 쓰는 글입니다.

* 그러니 조언과 지적 및 훈수는 언제나 환영입니다! 댓글로 많이 달아주세요!

 

옛날 글(메모리구조) 정리하다가 이런 것도 있었군 하면서 메모하는 중..

지금 다시 보니 C, C++에 가까운 듯..



왜 메모리 할당 시에 여유 공간을 넣어주는가?

그리고 왜 효율적인가?


바이트 패딩(Byte Padding)

바이트 패딩(Byte Padding)이란 클래스나 구조체를 위한 메모리 할당 시에

바이트를 추가해서 CPU 접근에 부하를 덜어주는 기법이다.

 

여기서 패딩은

padding의 사전적 의미

즉, 원래 있던 것도 충분하지만 추가적으로 더 넣어버린다는 뜻이다.

 

그럼 바이트 패딩은 뭘 추가하려는 걸까? 바로 공간이다.

 

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번 접근하기 때문에 효율적이다.

 

참고 자료

[블로그] 구조체 바이트 패딩

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!