为了在32位机器和64位机器之间传递状态消息,我们给消息格式做了padding:
struct StateMsg
{
uint32_t msgType;
uint32_t padding;
uint64_t msgID;
};
这样,不管是在32位机器上还是64位机器上,消息的大小都是16个字节。开始一切正常,直到后来我们发现有问题:程序里会比较本条状态消息与上一条有什么不同,如果不一样,要清空路由表;如果一样,就说明状态没有变化,于是不做任何操作。而错误出现在我们的消息比较用的是memcmp:
memcmp(oldMsg, newMsg, sizeof(struct StateMsg));
这下连padding也加入比较了,但是padding我们却没有对它赋初值!结果,每条消息都和上一条不同,路由表于是被频繁的清空….
padding本身是用来对齐的,对业务没有任何意义,所以赋值的时候容易忘掉它。教训啊