我主要在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
部分会不会破坏?如果我使用继承怎么办?这是一个愚蠢的事情吗?
答案 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) );
}
顺便说一下。通过网络直接从结构发送数据会导致不同平台之间的填充和/或结束问题。