nginx有关位域的使用
这里截取一段nginx里的结构体:
struct ngx_listening_s { unsigned open:1; unsigned remain:1; unsigned ignore:1; unsigned bound:1; /* already bound */ unsigned inherited:1; /* inherited from previous process */ unsigned nonblocking_accept:1; unsigned listen:1; };
这个玩意以前从来没用过,查了下资料原来叫位域,在上面的ngx_listening_s结构体中(没有截取完整),open,remain等字段后面的:1,指明了这些字段仅占一个字节中的一位,其类型为unsigned。
这么做的好处很显然,节省存储空间,分配的时候速度也会快一点,因为nginx一般都用的pool分配数据,自己计算地址啥的(当然如果不够分配了还是会用malloc)。
为啥要类型是unsigned的呢?很显然,如果是signed,那岂不是有负的情况了(其实有负也不会影响,因为大部分nginx判断语句是这样写的:if(ls->open))。
另外这些字段不能用&取地址。它们的访问与普通字段没什么太大区别。