티스토리 뷰

Programming/C & C++

[ARM, ETC] __ALIGN, PACKED

유승구 2010. 3. 11. 13:17

임베디드에서는 메모리 할당이라는 중요한 문제가 있다. 개발환경과 실제 코드가 컴파일되어 실행되는 환경상에 차이가 있기 때문이다.

ALIGN의 경우에는 Visual studio에서 제공한다기 보단 ARM 컴파일러에서 명시되어있는 것 뿐이 못봤지만.. 분명 있을 터!
(VS 환경에서는 #pragma packed 라는 선언으로 packed 사용)

나야 아직 정확하게 뭔가를 알 그런 시기는 아니니 일단 스스로 이해한 내용을 적어보자면!

구조체를 사용하여 자료를 전송하는 네트워크의 경우 메모리관리를 어떻게 했느냐에 따라 에러를 발생시킨다.

struct a{
   int a;
   char b;
   char c;
}

이 a란 구조체의 크기는 과연 얼마인가? VS의 경우(32bit)에는 12Byte, ARM일 경우에는 12Byte일수도 있고 6Byte로 나올수도 있다. 또한 이 사이즈는 컴파일러에 따라 다르다.

이런 상태로 전송했을때 우리 컴파일러는 12byte로 네트워크 전송을 했을 테고 이는 문제가 생길수 있다! 왜냐면 나는 6byte짜리를 만들었다고 가정했을 테니까..

그러므로 명확하게 이를 명시해 놓고 해야할 작업은 해줘야 한다 이말씀.

align은 내가 원하는 byte크기만큼 메모리 정렬을 시켜주는데 이때에는 2의 배수로 해준다.
(32bit운영체제에서 4byte가 가장 접근이 용이한 형태 즉 32bit이므로! 5byte같은 수로 처리를 정렬을 해주게 되면 짝수 바이트로 처리한 것 보다 메모리 손실이 있을 수 있으므로 2의 배수 형태로 해준다.)

__align(2), packed(2)

둘의 차이가 무엇이냐 라고 생각한다면 사실 아직 잘 모르겠다; ㅎㅎㅎ;
하지만 정렬의 입장에서 볼때에 align과 제품을 만들어 케이스에 꼼꼼히 담는 packed를 생각해본다면 느낌이 좀 오는 거 같다.
메모리 관점에서... 이점은 좀더 생각해볼 가치가 있는 것 같다.

혹시 아시는분! 알려주세요.. ㅎ;
댓글
댓글쓰기 폼