2011-12-20 3 views
0

최근 다른 하드웨어 아키텍처에서 실행되는 두 개의 응용 프로그램을 통합했습니다. 네트워크 바이트 순서 문제와 구조체 패딩 문제가있었습니다. 비트 필드와 pragma

고칠 수있을만큼 간단했다 - 나는 그냥 그렇게 내 네트워킹 구조체 주위 프라그 마를 추가했다, 특히 패딩 : 내가 가지고있는하지만 어제 비트 필드에 관한 몇 가지 질문을했다
#pragma pack(1) 
struct {}; 
#pragma pack(0) 

사용되지 않았습니다. 궁금 해서요 ... 비트 필드를 사용하여 구조체를 정의하여 채우기를 중지하고 시도하는 것이 더 옳았습니까? 이 시나리오에서 도움이 되었습니까?

또한 C++ 코드에서 bitfields를 많이 사용하지 않았습니다. 사용하지 않는 C 코드를 많이 사용했거나 사용하지 않은 코드에서 작업 한 적이 있습니까?

+0

비트 필드를 사용하는 코드로 작업하지 않은 경우입니다. 그들은 ** 적절한 장소 **에서 매우 유용합니다 **. 장소가 적고 특이한 장소. –

답변

3

아니요, 비트 필드는 네트워크 패킷 정의와 같은 외부 표현에 끔찍한 선택입니다. 비트 필드의 메모리에서 레이아웃을 선택하는 것은 컴파일러에 달려 있습니다 (어떤 식으로 비트가 정렬되는지, 주어진 필드에 예약 된 바이트 수 등). 따라서 상호 운용성을 완전히 없앨 수 있습니다.

그렇긴해도, 나는 네가 만났던 이유 때문에 이걸 "벗은"구조로 사용하는 것에 반대했다.

필자가보기에 적절한 방법은 수동으로 필드를 하나씩 serialize/de-serialize하는 것입니다.

+0

예, 대부분의 인터페이스는 일종의 직렬화 형식을 사용합니다 (그러나 우리는 놀랍게도 불편한 것을 선택했습니다). 이 인터페이스는 분명히 더 문제가되지 않았으므로 지금은 더 많은 이점을보고 있습니다. –

+1

대답에 추가하려면 :'#pragma pack'은 모든 기계에 존재하지 않을 수 있고 이식 가능한 코드가 의존 할 수 없다는 것을 나타내는 pragma입니다. 네이 키드 구조체를 사용하지 않는 더 많은 이유 (또는 'int'의 크기와 표현은 기계마다 다를 수 있기 때문에 네이티브 형 int도 가능). –

관련 문제