我正在使用一种int
类型来存储值。根据程序的语义,该值始终在很小的范围内(0-36)变化,并且int
(不是a char
)仅由于CPU效率而使用。
似乎可以对这么小的整数范围执行许多特殊的算术优化。这些整数上的许多函数调用可能被优化为一小组“魔术”运算,甚至某些函数甚至可能被优化为表查找。
因此,是否可以告诉编译器这int
总是在很小的范围内,并且编译器可以进行那些优化?
4
值范围优化存在于许多编译器中,例如。llvm,但我不知道要声明的任何语言提示。
—
Remus Rusanu
请注意,如果您永远不会有负数,那么使用
—
user694733 '16
unsigned
类型可能会有一点收获,因为编译器更容易使用它们。
@RemusRusanu:Pascal允许您定义子范围类型,例如
—
Edgar Bonet
var value: 0..36;
。
“ 仅因为CPU效率而使用int(而不是char)。 ”这种传统观点通常不是很正确。窄类型有时需要零或符号扩展到整个寄存器宽度,特别是。当用作数组索引时,但有时这是免费的。如果您有这种类型的数组,则缓存占用空间的减少通常会超过其他任何因素。
—
彼得·科德斯
忘了说:
—
彼得·科德斯
int
并且unsigned int
在大多数具有64位指针的系统上,也需要从32位符号扩展或零扩展到64位。请注意,在x86-64上,对32位寄存器的操作是免费零扩展到64位的(不是符号扩展,但是有符号的溢出是未定义的行为,因此编译器可以根据需要使用64位有符号的数学运算)。因此,您只会看到将零位扩展32位函数args的额外指令,而不是计算结果。您将使用较窄的无符号类型。