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))。

另外这些字段不能用&取地址。它们的访问与普通字段没什么太大区别。

原文地址:https://www.cnblogs.com/zhuiyicc/p/11794413.html