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

C 微观优化:对flag/bool类型使用intptr\t,c,x86-64,c99,micro-optimization,systems-programming,C,X86 64,C99,Micro Optimization,Systems Programming,据我所知,intptr_t的定义因体系结构而异——它保证有能力表示可以访问进程所有统一地址空间的指针 Nginx(流行的开源web服务器)定义了一个用作标志(布尔值)的类型,该类型定义为intptr\t。现在以x86-64体系结构为例——它可以访问覆盖所有大小操作数的大量指令——为什么要将标志定义为intptr\t?当然,使用32位bool类型的传统也同样适合这一要求 当我还是一名新开发人员时,我自己也讨论过32位bools与8位bools的争论,结论是32位bools在常见情况下表现更好,因为

据我所知,intptr_t的定义因体系结构而异——它保证有能力表示可以访问进程所有统一地址空间的指针

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


当我还是一名新开发人员时,我自己也讨论过32位bools与8位bools的争论,结论是32位bools在常见情况下表现更好,因为处理器设计复杂。那么为什么需要使用64位bools呢?

真正了解nginx为什么使用
intptr\t
作为布尔类型的人只有nginx开发人员

正如您所说,在常见情况下,32位bool通常比8位bool性能更好。我自己也没有做过基准测试,但在x86-64上的某些情况下,64位bool胜过32位bool,这对我来说听起来并不不合理。例如,在nginx源代码中,我注意到大多数
ngnx\u flag\u t
出现在与其他
(u)intptr\u t
类型定义的结构中。由于对齐填充,32位布尔可能无法在此处节省空间


我确实觉得
intptr\u t
的选择有点奇怪,因为它是一种可选的C99类型,目的是转换为/from
void*
。但据我所知,它从来没有这样使用过。也许这种类型最接近“本机”字号大小的类型?

64位bool对于x86-64来说似乎是个糟糕的主意。我猜写这篇文章的人当时想的是32位机器,带有32位指针

现代x86非常支持未对齐的加载/存储,以及动态解压字节以填充寄存器。如果x86是主要目标,则应首选8位布尔值,尤其是在它节省字节从而减少缓存使用的情况下。在很少情况下,缓存根本不是问题,32位是自然大小,在某些情况下,如果布尔值直接与
int
相加或相乘,则可能会保存指令,方法是允许布尔值用作内存操作数,而不是加载
movzx

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