在以前的雇主中,我们正在编写必须“通过网络”传输到其他计算机的二进制消息。每条消息都有一个标准标题,例如:
class Header
{
int type;
int payloadLength;
};
所有数据都是连续的(标题,紧随其后的数据)。鉴于我们有一个指向标头的指针,我们想要访问有效负载。传统上,您可能会这样说:
char* Header::GetPayload()
{
return ((char*) &payloadLength) + sizeof(payloadLength);
}
甚至:
char* Header::GetPayload()
{
return ((char*) this) + sizeof(Header);
}
这似乎有点冗长,所以我想出了:
char* Header::GetPayload()
{
return (char*) &this[1];
}
起初它似乎相当令人不安,使用起来可能太奇怪了——但非常紧凑。关于它是聪明的还是可憎的,有很多争论。
那么它是什么 - 对编码的犯罪,还是很好的解决方案?你有过类似的取舍吗?
-更新:
我们确实尝试了零大小的数组,但当时编译器给出了警告。我们最终采用了继承的技术:Message 派生自 Header。它在实践中效果很好,但原则上你说的是一条消息 IsA Header - 这似乎有点尴尬。