객체의 메모리 - 구조체도 동일함.

보물창고·2021년 7월 26일
0
post-thumbnail
  • 코드 없는 프로그래밍 강의를 공부하고 정리한 내용입니다.

1. 클래스의 크기

  • 멤버 함수는 객체를 할당할때 클래스의 멤버들과 함께 할당되는 것이 아니다.
    컴파일 시에 단 한번만 메모리에 할당되어서, this로 접근시 객체들의 주소로
    접근하는 것이다.

참고 : https://blog.naver.com/kimwontae466/222439087086

  • 멤버 변수의 크기로 결정된다.
    -> 메모리 할당 정책에 따라서 크기가 결정된다.

1) 멤버 변수가 한개만 존재할 경우

-> 4바이트의 크기가 출력됨.

2) 데이터형 다르게 존재할 경우에는 패딩이 발생하기도 한다.

-> 16바이트의 크기가 출력될 줄 알았지만, 24바이트가 출력되었다.

  • 8바이트의 패딩이 발생했다.

2. 멤버 변수간 패딩이 생기는 이유는? + 메모리 할당 정책

: 메모리 할당 정책 때문이다. 총 2가지가 있으며, 모두 만족해야 한다.

1) 각 멤버 변수는 0또는 사이즈의 배수의 위치에서 시작이 되어야 한다.

-> 따라서 double d8은 0에서 시작하거나 8에서 시작해야 한다.
그래서 i4a와 d8사이에는 4바이트의 패딩이 발생한다.

2) 오브젝트의 전체 사이즈는 가장 큰 멤버 변수 사이즈의 배수에서 끝나야 한다.

-> 따라서 가장 큰 d8의 크기는 8이므로 8의 배수인 24에서 끝난다.

  • 위 코드의 메모리 구조를 나타내는 그림

심화학습

: cpu는 멀티코어를 가지고 있다. cpu는 데이터 접근 시간을 최소화 하기 위해 캐시를 사용하며, 캐시 라인이 있다.
캐시 라인은 64바이트이다.
각각의 코어들은 캐시를 가지고 있어서, 동일한 캐시를 접근할 경우 Cash Sharing이라는 문제가 발생할 수 있다.
캐시라인 구조때문에 데이터 집합이 64바이트씩 잘라져서 다른 코어에 들어갈수 있다.

  • 만약 이와 같은 메모리 구조를 가지고 있다면, 병렬 프로그래밍에서 문제가 된다.

-> 해결하는 방법으로는 alignas 키워드를 사용하면 클래스의 크기가 한정된다.
패딩 공간을 뒤에 덧붙여준다.


=> 고양이 데이터가 잘려서 각각의 코어에 들어가는 것을 방지할 수 있다.

profile
🔥🔥🔥

0개의 댓글