为什么WinAPI对BOOL类型使用int(32位)?

y2k*_*y2k 6 c++ windows int winapi boolean

// <windef.h>

typedef int                 BOOL;
Run Code Online (Sandbox Code Playgroud)

这不是浪费内存,因为int是32位吗?

以防万一,我错了,我试图发送一个正常bool*到所需的功能BOOL*,并没有工作,直到我用的typedef INT.

Jon*_*art 19

哇,在那里放慢一点.首先,我敢肯定的程序员一直在使用4个字节的intS代表,因为在x86编程的开始布尔变量.(曾经没有bool数据类型这样的东西).我冒昧地猜测这个相同的typedef在Windows 3.1中<Windows.h>.

其次,您需要了解有关架构的更多信息.您有一台32位机器,这意味着所有CPU寄存器都是4字节或32位宽.因此,对于大多数存储器访问,它是更有效的存储和访问4个字节的值比为1字节的值.

如果有四个1字节的布尔变量打包到一个4字节的内存块中,其中三个不是DWORD(4字节)对齐的.这意味着CPU /内存控制器实际上必须做更多工作才能获得价值.

然后在粉碎MS之前制作那种"浪费"的typedef.考虑一下:大多数编译器(可能)仍然bool数据类型实现为4字节int,原因与我刚才提到的相同.在gcc中尝试一下,看看地图文件.我打赌我是对的.

  • 但是,在x86上,它很容易获得1个字节.当你有多字节值时,对齐问题会发挥作用.主要的低效率是当你做1时你正在读4个字节......但无论哪种方式都需要相同的时间. (4认同)
  • 历史论证是有效的,其余的不是.GCC产生1字节的bool.加载/存储1个字节在芯片级别上肯定是不同的,并且与加载4个字节相比,对缓存,对齐和并发性有不同的含义. (3认同)

AnT*_*AnT 13

首先,系统API中使用的类型必须尽可能与语言无关,因为该API将被多种编程语言使用.出于这个原因,任何可能在某些语言中不存在或者可能在其他语言中以不同方式实现的"概念"类型都是不可能的.例如,bool适合该类别.最重要的是,在系统API中,最好将接口类型的数量保持在最低水平.任何可以表示的东西都int应该用int.

其次,你断言这是"浪费记忆"毫无意义.为了成为"浪费内存",人们必须构建一个涉及极大数量BOOL元素的聚合数据类型.Windows API不使用此类数据类型.如果您在程序中构建了这种浪费的数据类型,那实际上就是您的错.同时,Windows API不会以任何方式强制您在BOOL类型中存储布尔值.您可以为此目的使用字节和偶数位.换句话说,BOOL是纯粹的接口类型.BOOL如果你正确使用它,那么类型的对象通常根本不占用任何长期记忆.

  • @DyP:不是.AFAIK现有的语言完全不支持1字节类型,因为它们没有理由. (3认同)