alignment 와 endian 에 관한 질문입니다~

0
points

리틀 엔디안나 빅엔디안으로 바이트를 정렬할 때, 선언된 모든 바이트에 대해 정렬 하는게 아니라..
정해진 alignment 로(word 면 4bytes 등) 정해진 범위 내에서 바이트 로 정렬을 하는게 맞나요?
즉, 11 22 33 44 55 12 13 가 있을 경우 리틀 엔디안으로 정렬 되게 되면, 4바이트 alignment 가된,
11 22 33 44 끼리 묶어서 리틀엔디한 하여 44 33 22 11 이 되고, 55 12 13 애들은 pad 55 13 12 이런식으로 따로 해서
되는게 맞나요?

[예]
struct {
chat c;
double d;
short s;
};

little endia;
______________________________
4 | pad(3b) |c(1b) | 0
|_______________________|______|
8 | pad(4b) | 4
|______________________________|
12| d(4b) | 8
|______________________________|
16| d(4b) |12
|______________________________|
20| pad(2b) | s(2b) |16
|________________|_____________|
24| pad(4b) |20
|______________________________|

위는 리틀엔디안 정렬시 doubleword aligned, sizeof 24 일 경우 위의 구조체가 정렬되는걸 도식화 한것입니다. (machine:ppc64 fx)
이 경우를 보고 제가 이해한 것은 alignement 의 설정 값 내에서( doubleword ) 멤버 변수값과 패딩값이 alignment 되고 그안에서
리틀엔디안 방식으로 이루어 지는 것으로 이해했는데요..결국 빅엔디안이다 리틀엔디안이다 하는것은
정해진 alignment 안에서 하나의 변수값과 삽입되어지는 패딩값을 큰값순서대로 혹은 작은값 순서대로 정렬하는거라고 이해하면 되는건가요?
또, 구조체에 __attribte__((packed)) 를 사용하여 패딩값을 제거해준뒤 리틀엔디안으로 정렬하게 되면 패딩값이 아닌 데이터들끼리 정렬을 하게 되나요?
d(4b) s(2b) c(1b) <- 이런식으로요..

좀 개념을 모호하게 잡고있는놈이라 질문도 명확해 보이질 않네요 ㅎ

좋은하루들 보내시고요~아시는 분은 답변 부탁드립니다 하하~

체스맨의 이미지
6254
points

endian과 바이트

0
points

endian과 바이트 정렬은 서로 관계가 없습니다. 따로 이해하셔야 되고 복잡할 건 없습니다.

아시겠지만 endian 은 2바이트 이상의 값이 어떤 바이트 순서로 저장되는가하는 특성을 나타냅니다.

바이트정렬은 일반적으로 n 바이트 크기의 값을 n 배수 주소에 배치하는 것입니다.

------

예를 들어 다음 구조체

struct {
short a;
int b;
};

는 멤버 a 를 2 배수 주소에 배치하고, 멤버 b를 4배수 주소에 배치하기 때문에 두 멤버 사이에 2바이트 패딩이 발생하겠죠.

이에 따르면 malloc 함수는 cpu 연산이 지원하는 각종 타입의 크기에 최소 공배수가 되는 주소를 리턴해야겠지요.

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.