今晚要睡觉了,我一直在想:例如,在C++中,如果bool
被设置为false
,这意味着它的所有(8或16(位都被设置为0(似乎是(。
据我所知,零位意味着某些晶体管中没有电流流动,因此false
bool
会在电池小于true
的设备中浪费能量?
因此,如果是的话,例如,在函数中,将默认的布尔(甚至可能是其他(参数设置为false
:会更好
代替:
void DrawImage(int x, int y, bool cached = true);
进行
void DrawImage(int x, int y, bool not_cached = false);
据我所知,零位意味着某些晶体管中没有电流流动,因此,在电池电量低于true的设备中,假bool会浪费能量吗?
不,不是因为这个原因CMOS逻辑在任何静态状态下都没有电流流动,只有在状态之间的转换中(对寄生电容进行充电/放电,以及当上拉和下拉晶体管都部分导通时流动的任何击穿电流(。当然,除了漏电流之外,在较低的时钟速度下,漏电流在一定程度上是显著的。
CMOS或多或少是对称的,除了N沟道和p沟道MOSFET之间的差异,所以在电压状态和晶体管如何让电荷流动方面,1与0没有什么不同。
在其他一些逻辑家族中,比如TTL(带上拉电阻器的双极晶体管(,晶体管可以通过上拉电阻器将电流拉到地上,这是正确的。但只有一个门;通常逻辑涉及多个反相,因为放大器自然反相(在CMOS或TTL或RTL中(。
也仅适用于用于传递arg的寄存器中64位中的1位。CPU的流水线状态和无序执行机制占用的晶体管(和门(远远多于实际的体系结构状态(寄存器值(和操作的数据。因此,1位的状态几乎可以忽略不计。
CPU中有大量的微小晶体管,这就是为什么CPU几十年来一直使用CMOS逻辑的原因,否则通过RTL或TTL中的上拉电阻器的静态电流会融化它们。
即使使用CMOS,自2000年代初以来,功率密度也一直是一个问题(用于频率缩放的"功率墙",如现代微处理器中所述90分钟指南如果您想了解更多关于CPU设计的注意事项,这是非常重要的阅读内容(。在CMOS中,需要更高的电压才能更快地切换(大约是线性的(,电容器中的能量与V^2成比例。只有当栅极从0切换到1时,电流才会在CMOS中流动,反之亦然,而发生这种情况的速率是CPU时钟的某个因素。因此,在给定频率的最小电压下运行,功率约为f^3
。
其他可能使创建0更便宜的因素
在x86上,xor edi, edi
是比mov edi, 1
便宜的指令。在Sandybridge系列CPU上,它甚至不需要后端的执行单元,所以这肯定是一些不需要切换的晶体管。以及较小的指令(2字节对5字节,或者mov dil, 3
为3字节,以部分寄存器性能损失为代价节省代码大小(。因此,传递0
也许可以提高性能,让相同数量的指令更快地完成,让CPU更快地恢复睡眠(竞相进入睡眠(。或者不是,可能很容易就没有效果,或者后面指令的不同代码对齐可能会随着更长的指令而变得更好。
大多数其他ISAs在寄存器中归零和设置1之间没有太大区别。即使在x86上,这通常也不是一个非常有价值的优化。
但是,如果您可以选择一个值是特殊的,那么0
是一个不错的选择,尤其是对于非bool
整数,因为测试0
与非0
比测试任何其他数字都更有效。(例如,如果您使用纯int
,x != 0
比x == 1
便宜。使用bool
,如果使用b == true
,编译器已经可以测试非零。(
虽然从技术上讲,这可能会节省能源,但节省的数量可以忽略不计,因为它只是一个被设置为true或false的比特,而且考虑到权衡,你必须达到的长度是不合理的。
即便如此,让读者跳过更多的心理障碍,让你的代码更难阅读,因为你必须三思而后行,这也是一个坏主意。不过,想想也很有趣。