C语言大型项目中那些结构体是如何定下来,操作系统里有些结构体特别复杂,好多指针指向链表,他们如何设计?

来源:互联网 发布:adobeillustrator mac 编辑:程序博客网 时间:2024/05/22 10:36



作者:姚冬
链接:https://www.zhihu.com/question/26292776/answer/32548584
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

结构体的设计主要考虑几个问题:

1. 编译环境无关,主要就是sizeof问题,尽量用typedef过的类型,比如DWORD uint32_t,可以准确控制大小,另外字节对齐也要考虑,最好用#pragma pack也指定对齐方式,可以做到兼容32 64位。

2. 节约空间,声明的顺序要想好,最好按照字节对齐摆放,如果你非要一个 char,一个int地间隔声明就会浪费很多空间。另外用 数组还是指针加长度,要好好考虑下,在可预见的未来长度有限就用数组,否则指针加长度,指针加长度毕竟会导致多一块内存分配,而且这样结构体不能简单地通过memcpy复制了,要慎重。如果有好多bool型的值,可以考虑用位来表示 struct { int x:1, int y:1 int z:1 },或者声明成DWORD,然后用按位声明的值去或出来,比如 Windows style, WS_VISIBLE | WS_CAPTION

3. 前后兼容,如果未来可能会修改的,最好在结构体开头放一个 version,表示版本,使用者要注意检查版本号,可以保持前后兼容,修改了声明就改下版本号。Windows的做法是放一个cbSize,反正通常改结构体的话sizeof也是会变的。保留几个 reserve供未来使用也可以。

4. 命名,我喜欢给结构体一个统一的前缀,而且全大写,让人一眼就看出这是个结构,和其他的class interface区分开。
编辑于 2014-10-28




阅读全文
0 0
原创粉丝点击