用一个int替换多个bool并使用位掩蔽的性能优势? 我有一个C++应用程序,我使用多个布尔函数来检查if语句的条件。使用cachegrind,我的分支预测失误率约为4%,所以还不错。但是,我确实需要尝试提高性能

用一个int替换多个bool并使用位掩蔽的性能优势? 我有一个C++应用程序,我使用多个布尔函数来检查if语句的条件。使用cachegrind,我的分支预测失误率约为4%,所以还不错。但是,我确实需要尝试提高性能,c++,linux,performance,optimization,bit-manipulation,C++,Linux,Performance,Optimization,Bit Manipulation,用一个整数替换12x布尔值是否值得。我使用64位Red Hat,我相信布尔值是用4字节整数表示的。因此,我使用的是48字节,而不是12位 如果我要使用位屏蔽,我想我仍然需要存储位模式来访问整个int中的特定位。存储这些位模式的需要会抵消减少池数量所节省的字节数,从而使这个想法毫无意义吗?唯一可以确定的解决方案是分析。在某些体系结构上使用INT可能会更慢,因为访问单个位可能会涉及一些位移位和掩蔽。尽管确定答案的唯一方法是尝试一下,但有几个因素可能会影响您的决定 首先,存储量会下降:您不必“在整个i

用一个整数替换12x布尔值是否值得。我使用64位Red Hat,我相信布尔值是用4字节整数表示的。因此,我使用的是48字节,而不是12位


如果我要使用位屏蔽,我想我仍然需要存储位模式来访问整个int中的特定位。存储这些位模式的需要会抵消减少池数量所节省的字节数,从而使这个想法毫无意义吗?

唯一可以确定的解决方案是分析。在某些体系结构上使用INT可能会更慢,因为访问单个位可能会涉及一些位移位和掩蔽。

尽管确定答案的唯一方法是尝试一下,但有几个因素可能会影响您的决定

首先,存储量会下降:您不必“在整个
int
中存储访问特定位的位模式”,因为这些模式将成为程序“烘焙”到二进制代码中的常量

其次,您应该查看标志的使用模式。如果经常检查多个标志的组合,则可以使用单个屏蔽操作替换其中的一些检查

第三,您应该考虑回写数据的方面:用单独的<代码> Boo[>值]每个写都转到自己的位置,而一个带有标志的解决方案每次需要修改标志时都会写入同一个字节或两个字节。另一方面,一次修改几个标志可以在一次写入中完成


最后,你应该考虑可读性的问题:在这个改变之后,你的程序一定会变得更加复杂。与可读性的损失相比,性能的提高可能太小,因为在几年内硬件变得更快时,代码会运行得更快,但可读性较差的代码将永远无法读取。

在尝试并分析它之前,您不会知道,这一阶段的猜测是适得其反的,它取决于整个上下文。如果只有12个布尔值,那么它们就可以放在一个缓存线中,而且添加的位屏蔽可能会降低速度。另一方面,如果你有一个包含12个布尔值的大型数组或结构向量,将它们放在一个
int
中可以提高局部性,并可能会加快速度(但在你尝试之前你不会知道)。12个布尔值会在缓存线中修复,所以我猜缓存未命中不是一个主要的瓶颈。但是,如果您的代码可能会扩展到支持更多(越来越多)bool,那么就值得尝试位屏蔽,比如c++的专用std::vector?是否值得降低代码的可读性?如果我正确地理解了你的去描述,我粗略的猜测是,这不值得优化,除非你的bool-s在一个拥有数千个实例的类中,或者你在最深的周期中使用bool-s,这决定了你的执行时间。C++的方法是封装和优化实现的后向。但是,是的,您可以通过将整个内容保存在一个处理器寄存器中,并通过机器指令级别上的常量进行位屏蔽来获得这些信息。@user997112它不太可能有帮助,但并不意味着它没有帮助。如果您需要提高性能,那么了解此更改是否会提高性能的唯一方法就是尝试。这可能有帮助;可能不会。