2014-10-02 66 views
0

我主要用C語言編寫嵌入式世界的程序,最近我一直在用C++進行實驗,我有一個想法。這個問題涉及通過網絡傳輸的數據。 目前在C I這樣做人爲的例子(不考慮填料):代表網絡數據包的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++中做類似的事情嗎?

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部分,會不會破壞?如果我使用繼承呢?這是一個愚蠢的(TM)事情嗎?

+0

Yuck。請不要這樣做。只需讓成員函數接受/返回指向序列化消息的指針即可。封裝是你的朋友。 – kkrambo 2014-10-03 12:47:24

回答

0

您通常希望保持工會簡單。構造,複製,分配或移動語義都不適用於它們;即使成員具有定義的功能。儘管使用複雜的數據類型通常不是一個好主意,因爲你需要擔心vtable,訪問修改成員的位置等等。但是,POD類基本上與C結構(C++結構體是相同的也基本上與班級相同)。根據我的理解,內存佈局不是C++標準的一部分,除了POD類型的成員變量的順序。公共,受保護和私有變量可以放置在單獨的內存區域中。我認爲繼承的成員佈局也是實現定義的。因此,任何依賴於佈局的代碼都是特定於平臺/編譯器的。成員通常按順序排列,但依賴佈局通常不是一個好主意(例如多重繼承)。顯然,對齊仍然是平臺/編譯器定義的,但您可以使用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

聯合使用,以便我可以鍵入我的消息結構到char數組上。我認識到我可以使用uint8_t指針來傳輸(當然,就endianness而言),但聯合對於接收數據包非常有用。 – thndrwrks 2014-10-03 22:05:33