2014-10-02 2 views
0

저는 주로 임베디드 세계에서 C로 프로그램을 작성했으며 최근에는 C++로 실험하고 있습니다. 이 질문은 네트워크를 통해 전송 된 데이터에 관한 것입니다.네트워크 패킷을 나타내는 C++ 클래스

typedef struct { 
    time_t date; 
    float value; 
} Message1;  

typedef union { 
    char raw[sizeof(Message1)]; 
    Message1 msg; 
} Overlay; 

int my_func(Message1* ptr) 
{ 
    /* do stuff with stuff */ 
} 

데이터 Overlay.raw에 넣고 msg을 통해 검사한다 (물론 엔디 언에 대한) : 현재 C에서 이런 인위적인 예처럼 (무시 포장) 뭔가. 구조체를 사용하지 않고 C++에서 비슷한 작업을 수행 할 수 있습니까?

class Message1 { 
    public: 
     time_t date; 
     float value; 
     int my_func() { /* do stuff with stuff */ }; 
} 

typedef union { 
    char raw[sizeof(Message1)]; 
    Message1 msg; 
} 

나는 몇 가지 실험을 해봤에서이 지금까지 작동하는 보인다 내가 그것을 알 수 있습니다. 그러나 C++이 클래스에서 어떻게 정렬되는지에 대한 자세한 내용을 알고 싶습니다. 마찬가지로 public 섹션 뒤에 private 섹션을 추가하면 어떻게됩니까? 상속을 사용하면 어떨까요? 이건 멍청한 짓이야?

+0

턱. 제발 하지마. 직렬화 된 메시지에 대한 포인터를 수락하거나 반환하는 멤버 함수를 만들면됩니다. 캡슐화는 당신의 친구입니다. – kkrambo

답변

0

일반적으로 노동 조합을 단순하게 유지하려고합니다. 어떤 구조, 복사, 할당, 또는 이동 의미도 그것들에 적용되지 않는다; 멤버가 정의 된 함수를 가지고 있더라도. vtables, 액세스 수정 멤버의 배치 등에 대해 걱정할 필요가 있기 때문에 일반적으로 복잡한 데이터 유형을 사용하는 것은 좋지 않습니다. , POD 클래스는 기본적으로 C 구조체와 같습니다 (C++ 구조체는 또한 본질적으로 클래스와 동일).

제가 알고 있듯이 메모리 레이아웃은 POD 유형의 멤버 변수 순서와는 별도로 C++ 표준의 일부가 아닙니다. public, protected 및 private 변수는 별도의 메모리 영역에 배치 할 수 있습니다. 나는 상속 된 멤버 레이아웃도 구현 정의라고 생각합니다. 따라서 레이아웃에 의존하는 모든 코드는 플랫폼/컴파일러에 따라 다릅니다. 멤버는 일반적으로 순차적 인 순서로 배치되지만 일반적으로 레이아웃 (예 : 다중 상속)에 의존하는 것은 좋지 않습니다. 분명히 정렬은 여전히 ​​플랫폼/컴파일러로 정의되어 있지만 alignas(T) (C++ 11)을 사용하여 정렬을 제어 할 수 있습니다.

또한 스타일 선호도 일 수도 있지만 공용체를 명시 적 유형으로 사용하는 것이 좋습니다. typedef 대신에.

union pkt { 
    char raw[sizeof(Message)] 
    Message msg; 
} 
0

여기에 노동 조합을 사용하는 데는 충분한 이유가 없습니다.
(char *)에 대한 구조체 포인터의 형 변환을 통해 바이트 배열로 공용체를 사용하면 아무런 이점이 없습니다.

패킷을 보내려는 경우 공용체에서 데이터에 액세스 할 필요가 없습니다.

typedef struct { 
    time_t date; 
    float value; 
} Message1; 

void sendData(uin8_t *pData, int size) 
{ 
    while (size--) 
    sendByte(*pData++); 
} 

int main() 
{ 
    Message1 myMessage; 
    sendData(&myMessage, sizeof(myMessage)); 
} 

btw. 네트워크를 통해 구조체에서 직접 데이터를 보내면 서로 다른 플랫폼 간의 패딩 및/또는 엔디안 문제가 규칙적으로 발생합니다.

+0

공용 구조체를 사용하여 문자 배열에 메시지 구조체를 입력 할 수 있습니다. 나는 (물론 endianness와 관련하여) 전송하기 위해 uint8_t 포인터를 사용할 수 있지만 유니온은 패킷 수신에 매우 유용하다는 것을 알고있다. – thndrwrks

관련 문제