2010-12-22 2 views
3

C++에서 typedef 구조의 경우 #pragma pack이 필요한 이유는 무엇입니까? 특히 네트워크 통신에서 이러한 구조를 사용하는 경우.#pragma pack in C++

+0

여기에 필요한 정보가 모두 있습니다. 그것은 검색 쿼리'pragma pack'으로 Google에서 1-st입니다 : http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax

+0

이것은 무엇을해야합니까? 객체 지향 프로그래밍? –

답변

0

#pragma pack 지시문은 지시문을 따르는 선언이있는 구조체의 멤버에 대해서만 현재 정렬 규칙을 수정합니다. 구조체의 정렬에 직접 영향을주지 않지만 구조체의 정렬에 영향을 주어 정렬 규칙에 따라 전체 구조체의 정렬에 영향을 미칠 수 있습니다.

13

#pragma pack 구조체의 정렬을 제어합니다. . 공통 기본 설정은 8이며 최대 8 바이트 길이의 구성원이 크기의 배수 인 주소에 정렬되도록합니다. 예를 들어 double 또는 64 비트 포인터. 잘못 정렬 된 이중 읽기 또는 쓰기는 상당히 비쌀 수 있습니다. 일반적으로 CPU 캐시 라인 경계에 걸쳐 있으면 3 배 느립니다. 이 정렬은 패딩이라는 멤버간에 사용되지 않는 공간을 생성 할 수 있습니다.

정렬 이런 종류의 네트워크 프레임 종종 부적절한

, 그들은 단단히 패딩,의 #pragma 팩없이 포장하는 경향이 (푸시, 1) 당신은 단지에 같은 설정 이야기 2 시스템을 수 있도록해야하는 경우

+3

+1 : 또 다른 요점은 다음과 같습니다. 구조체가 압축되어 있지 않고 CRC 체크섬을 작성하려는 경우 구조체의 모든 단일 멤버에 액세스해야하기 때문에 어려워집니다. 반면에 1의 패킹을 사용하면 모든 바이트에 액세스 할 수 있습니다 구조체의. –

0

서로 (테스트, ...), 당신은 구조체를 보낼 수 있습니다, 그들은 단지 POD (일반 오래된 데이터) (포인터, 가상 테이블, std :: strings ... 사용할 수 없습니다). 따라서 팩은 필요하지 않습니다.

시스템에 설정이 동일하지 않거나 알 수없는 경우 프로토콜로 직렬화 된 데이터를 보내야하므로 포장 된 구조는 작동하지 않습니다. 유효한 프로토콜이 사용 가능한지 여부를 확인하는 것이 가장 쉽습니다.

0

컴파일러는 구조체의 필드와 하위 필드를 "패드"합니다. 즉, 중간에 아무 것도없는 빈 덩어리의 메모리로 메모리에서 구성합니다. Hans Passant의 답변에 따르면 효율성을 높이기 위해이 작업을 수행합니다.

서로 다른 컴파일러/대상/최적화 설정이 다르게 패딩되어 부동 한 메모리 표현에서 동일한 '논리'구조체를 변형 할 수 있습니다. 따라서 두 통신 기계가 그 사이의 구조체를 전달하면 서로 이해할 수 없습니다.

#pragma pack은 컴파일러의 자유를 제한하기위한 방법입니다.

#pragma pack (push, 1)은 컴파일러가 전혀 패드하지 않도록 지시합니다. 서로 다른 코드로 정의 된 두 개의 동일한 구조체에 대해 이렇게하면 메모리에 동일하게 나타납니다. 그런 다음 한 응용 프로그램에서 구조체의 내용을 포인터와 sizeof()를 사용하는 프로토콜을 통해 안전하게 보낼 수 있습니다. 다른 쪽에서 가져 와서 동일한 구조체에 포인터를 쓰고 sizeof()를 사용하여 안전하게 작성할 수 있습니다.