구조체
-
메모리 정렬, 패딩 그리고 비트필드(feat. 구조체)개발/C·C++ 2024. 7. 7. 10:37
컴퓨터는 극한의 효율을 추구해야 한다. 경쟁에서 우위를 점해야 하기도 하고 엔지니어 관점에도 같은 전기를 쓰면서 최대 성능과 최대 효율을 뽑는 것이 중요한 문제일 수밖에 없다. 메모리 정렬에 몇 가지 규칙이 존재한다.1. 데이터가 저장되는 메모리 경계가 존재한다2. 1 바이트 데이터는 1 바이트 경계, 4 바이트 데이터는 4 바이트 경계3. 여기서 말하는 경계는 4바이트 데이터가 저장되는 시작 주소가 4의 배수인 것을 말한다4. 예를 들어 배열이 아닌 int형 데이터는 0x00000040(편의상 32비트 주소 체계 기준)에 저장된다 메모리 정렬을 이야기할 때 데이터를 모아놓은 구조체가 자주 등장한다.다음의 두 구조체는 자료형의 총합은 같지만 실제 메모리 공간에서 차지하는 크기가 다르다.// 정렬되지 않은..
-
union개발/C·C++ 2021. 9. 24. 14:12
구글링을 하면 나오는 union에 관한 얘기 중에 다른 변수에 값을 넣으면 이전에 넣은 데이터가 지워진다는 이야기가 나옵니다. 반은 맞고 반은 틀렸습니다. struct Test { union { int i; struct { unsigned int t1 : 1; unsigned int t2 : 1; unsigned int t3 : 1; unsigned int t4 : 1; unsigned int t5 : 1; unsigned int t6 : 1; } s; } u; }; Test 객체를 만들어서 크기를 보면 4바이트가 나옵니다. union 안에 있는 구조체는 멤버 변수는 1비트만 갖게 했기 때문에 멤버 변수가 32개가 넘지 않는 한 4바이트가 나옵니다. union은 메모리를 공유하기 때문에 마지막으로 덮어씌..
-
구조체 바이트 정렬은 만능이 아니다개발/C·C++ 2019. 10. 19. 17:13
pragma once에 이은 만능 시리즈는 아니다. 이 기능들을 별 생각 없이 사용했다가 뇌 곳곳에서 유혈이 낭자한 끝에 얻은 교훈을 남기고 싶을 뿐이다. 공교롭게 둘 다 pragma 키워드를 사용하는 것은 우연의 일치일까. 심도 있게 설명하고 싶지만 아직은 능력이 부족한 탓에 수박 껍질만 핥아보려고 한다. 핥핥핥. 제대로 된 실무 코드는 제대로 본 적이 없지만 소켓 프로그래밍에서는 패킷 헤더는 보통 구조체 바이트 정렬을 하는 것으로 보인다. 구조체 정렬은 함부로 쓰면 안 되지만 패킷 헤더에는 언제나 같은 크기의 데이터가 들어가(야 하)며, 동적으로 메모리를 할당할 일이 없기에 괜찮은 듯하다. 1 2 3 4 5 6 7 #pragma pack(push, 1) struct PacketHeader { shor..