일반적으로 패딩은 개발자가 아니라 컴파일러가 답니다.
굳이 개발자가 달 필요는 없습니다.
“Every complete object type has a property called alignment requirement, which is an integer value of type size_t representing the number of bytes between successive addresses at which objects of this type can be allocated. The valid alignment values are non-negative integral powers of two.
In order to satisfy alignment requirements of all members of a struct, padding may be inserted after some of its members” https://en.cppreference.com/w/c/language/object
소켓으로 주고받는 packet data로 사용되는 구조체일 경우 그런식으로 합니다. (소켓뿐만 아니라 파이프 통신시에도 그런 경우 있습니다. 파이프 통신하는데, 통신상대가 바이너리와 API만 있는 서드파티 프로그램이어서 파이프상에 오가는 protocol을 손 못대는 경우)
protocol에 definition된 format에 맞춰야 넣어야 제대로 통신되니 padding도 직접 넣고 컴파일러가 자동 alignment 못하도록 하는 별도 키워드까지 씁니다.
x86은 해당없지만 unalignment memory access를 허용하지 않는 아키텍쳐의 cpu를 사용하는 경우 별도 변수에 담았다가 byte 단위로 copy 하는 식으로 넣어야 합니다.
...
말씀하신 것과 같은 이유로, 일반적으로는 개발자가 손으로 padding을 추가하지는 않습니다. 구조체 선언에 패딩이 들어있다면 뭔가 특수한 사정이 있는 거겠죠.
일반적으로 패딩은 개발자가 아니라 컴파일러가 답니다.
일반적으로 패딩은 개발자가 아니라 컴파일러가 답니다.
굳이 개발자가 달 필요는 없습니다.
“Every complete object type has a property called alignment requirement, which is an integer value of type size_t representing the number of bytes between successive addresses at which objects of this type can be allocated. The valid alignment values are non-negative integral powers of two.
In order to satisfy alignment requirements of all members of a struct, padding may be inserted after some of its members”
https://en.cppreference.com/w/c/language/object
소켓으로 주고받는 packet data로 사용되는
소켓으로 주고받는 packet data로 사용되는 구조체일 경우 그런식으로 합니다. (소켓뿐만 아니라 파이프 통신시에도 그런 경우 있습니다. 파이프 통신하는데, 통신상대가 바이너리와 API만 있는 서드파티 프로그램이어서 파이프상에 오가는 protocol을 손 못대는 경우)
protocol에 definition된 format에 맞춰야 넣어야 제대로 통신되니 padding도 직접 넣고 컴파일러가 자동 alignment 못하도록 하는 별도 키워드까지 씁니다.
x86은 해당없지만 unalignment memory access를 허용하지 않는 아키텍쳐의 cpu를 사용하는 경우 별도 변수에 담았다가 byte 단위로 copy 하는 식으로 넣어야 합니다.
Written By the Black Knight of Destruction
댓글 달기