代表网络数据包的C ++类

时间:2014-10-02 23:14:38

标签: c++ embedded

我主要在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 ++中做类似的事情吗?

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

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

我已经做了一些实验,从我可以告诉它似乎到目前为止工作。但是我想了解更多关于C ++如何在课堂上对齐的细节。比如,如果我在private部分之后添加public部分会不会破坏?如果我使用继承怎么办?这是一个愚蠢的事情吗?

2 个答案:

答案 0 :(得分:0)

您通常希望简化工会。构造,复制,赋值或移动语义都不适用于它们;即使成员具有定义的功能。但是,将它们与复杂数据类型一起使用通常不是一个好主意,因为您需要担心vtable,访问修改成员的位置等... 然而,POD类基本上是与C结构相同(C ++结构也与类基本相同)。

据我所知,除了POD类型的成员变量的顺序之外,内存布局不是C ++标准的一部分。公共,受保护和私有变量可以放在不同的内存区域中。我认为继承的成员布局也是实现定义的。因此,任何依赖于布局的代码都是特定于平台/编译器的。成员通常按顺序排列,但同样依赖布局(例如多重继承)通常不是一个好主意。显然,对齐仍然是平台/编译器定义,但您可以使用alignas(T)(C ++ 11)控制对齐。

此外,它可能只是样式首选项,但最好将union用作显式类型。而不是typedef。

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

答案 1 :(得分: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) );
}

顺便说一下。通过网络直接从结构发送数据会导致不同平台之间的填充和/或结束问题。