#pragma pack 的使用场景

    除了在学习 C 语言结构体字节对齐时,做练习题的时候碰到过,在几年的工作中,一直没有找到 #pragma pack 的使用场景。最近实现一套 C/S 系统的内部通信,在读取网络数据时,碰到了字节对齐引起的问题。具体如下:

    Server 用 Java 实现,发送数据是采用 WriteInt、WriteShort 等方式,并没有考虑字节对齐的问题(Java 也的确无需考虑)。我的最初设计是,定义一个对应的结构体指针,然后分别读取结构体中的各个字段,但是发现得到的数据不对。经过仔细比对,发现原因是数据错位。仔细思考才想到,是字节对齐引起的。

    定义的结构体如下:

        typedef struct tagTEST {

            uint32_t  i;

            uint16_t  j;

            uint32_t  k;

            ......

        }TEST_S;

    使用该指针指向网络数据包时,i 和 j 是对的,但是从 k 以后就开始错位。原因就是系统默认按照 4 字节对齐(这个说法不全对,如果是 uint32_t 和 uint64_t 在一起,uint32_t 后也会空余 4 字节),所以 j 和 k 之间有 2 个字节的填充。此时指向数据包,自然就发现错位了。解决办法也很简单,使用 #pragma pack 强制按照你所需要的字节对齐即可。

    后来想到,linux 中的 ip.h、tcp.h 也应该指定强制 1 字节对齐,但是看了源码,并没有使用 #pragma。why?

    #pragma 更多的参数请百度之。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章