更快地将整数用作布尔值?

时间:2011-05-06 17:36:13

标签: c optimization

从内存访问的角度来看......是否值得尝试这样的优化?

int boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

而不是

unsigned char boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

无符号字符当然只占用整数4(假设32位平台)的1字节,但我的理解是处理器从内存中读取整数值会更快。

5 个答案:

答案 0 :(得分:7)

它可能会也可能不会更快,速度取决于很多事情,通用答案是不可能的。例如:硬件架构,编译器,编译器选项,数据量(它是否适合L1缓存?),其他竞争CPU的东西等。

因此,正确的答案是:尝试两种方式并衡量您的具体情况。

如果测量没有表明一种方法明显快于另一种方法,那么选择更清晰的方法。

答案 1 :(得分:3)

这几乎不是一个好主意。许多系统只能同时从内存中读取字大小的块,因此读取一个字节然后屏蔽或移位实际上会占用更多代码空间和同样多的(数据)内存。如果您正在使用一个模糊的小系统,请测量,但一般情况下,这实际上会减慢并膨胀您的代码。

答案 2 :(得分:3)

  

从内存访问的角度来看......是   值得尝试优化   像这样?

可能不是。在几乎所有现代处理器中,将根据处理器的字大小获取内存。在您的情况下,即使要获得一个字节的内存,您的处理器可能会根据该处理器的缓存获取整个32位字或更多字。您的架构可能会有所不同,因此您需要了解CPU的工作方式。

但正如其他人所说的那样,尝试并衡量它并没有什么坏处。

答案 3 :(得分:2)

询问unsigned char占用多少int与<{1}}之间的内存仅在数组时才有意义(或者可能是结构,如果您需要将元素排序为照顾对齐)。作为一个单独的变量,你根本不可能保存任何内存,编译器可能会生成更大的代码来截断寄存器的高位。

作为一般政策,除了数组之外,永远不要使用小于int类型,除非你有一个非常好的理由而不是试图节省空间

答案 4 :(得分:0)

遵循标准的优化规则。首先,不要优化。然后在某个时候测试你的代码是否需要它。然后优化那一点。此链接提供了优化主题的优秀介绍。

  

http://www.catb.org/~esr/writings/taoup/html/optimizationchapter.html