代码之家  ›  专栏  ›  技术社区  ›  Hassan Syed

微优化:对flag/bool类型使用intptr\t

  •  4
  • Hassan Syed  · 技术社区  · 14 年前

    Nginx(流行的开源web服务器)定义了一个用作标志(boolean)的类型,这是一个typedef to intptr_t . 现在以x86-64体系结构为例——它可以访问覆盖所有大小操作数的大量指令——为什么要将标志定义为intptr\?当然,使用32位bool类型的传统也符合这个要求吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   schot    14 年前

    只有那些真正知道nginx为什么使用 intptr_t 对于boolean类型的是nginx开发人员。

    正如您所说,在一般情况下,32位bool的性能通常优于8位bool。我自己没有做过基准测试,但是在x86-64上的某些情况下,64位bool要比32位bool强,这听起来并不不合情理。例如,在nginx源代码中,我注意到 ngnx_flag_t 的与其他 (u)intptr_t 类型定义的类型。由于对齐填充,32位bool可能无法在此处节省空间。

    我确实找到了选择 入口 有点奇怪,因为它是一个可选的C99类型,目的是转换到/从 void * . 但据我所知,它从来没有这样使用过。也许这种类型是“原生”单词大小类型的最佳近似值?

        2
  •  1
  •   Peter Cordes Steve Bohrer    9 年前

    int ,方法是允许将布尔值用作内存操作数,而不是加载 movzx .

    对于通常的布尔型测试分支情况,无论是在内存中还是寄存器中,Intel和AMD CPU在8位和32位操作数之间的性能几乎没有差别。