三天前我读了article on choosing correct integer size
。在阅读本文之前,我没有意识到这三个关键字即:
1)固定宽度无符号8位整数:uint8_t
。 (Typedef是C99投诉)
2)最小宽度无符号8位整数:uint_least8_t
。
3)最快的最小宽度无符号8位整数:uint_fast8_t
。
所以我的问题是:
1)uint_least8_t
&和uint_fast8_t
和“{至少8位宽”是什么意思for(u16 i=0;i<counter;i++)
{
Increment_Counter++;
}
。例如,让我们看一下代码片段
counter =0xFF
这里: - u16表示无符号短。 counter和Increment_Counter是两个变量
当counter =0x01FF
; Increment_Counter可以通过任何类型的关键字声明正常工作。
现在uint_least8_t
;我应该选择什么样的声明? uint_fast8_t
(保证至少8位宽)或unit16类型?
2)选择uint_least8_t
如何影响代码速度。
3)如何选择calloc
比使用unsigned char消耗更少的数据内存。
提前致谢
答案 0 :(得分:3)
1)说“至少8位宽”是什么意思
这意味着编译器会将此映射到适合您的目标的类型,但您对此类型的唯一保证是它至少为8位。您的担忧不应局限于“我应该使用哪种类型来保护后增量” - 您应该专注于这8位内的合理用法。
所以,是的,请注意溢出但是真的很想想它对你的设计是否有意义。例如,这与用户输入有关吗?或者我们是否正在计算您设计中的一些静态元素?假设uint_fast8_t framistan_modules
被声明为计算“framistan”函数的数量。你只定义了3,你无法想象为什么你需要超过5个。
2)如何选择uint_fast8_t会影响代码速度。
如果没有经验指标,很难说出代码速度。但这种类型背后的想法是我的编译器可能会选择uint_fast8_t
的寄存器宽度类型,即使我的寄存器明显大于8位。
3)如何选择uint_least8_t比unsigned char消耗更少的数据内存。
不太可能不可能。但是,它与_fast8_t
类似,因为您为编译器提供了一定的自由度(不仅仅是8位)。这里的区别在于您没有像fast
那样优化速度,因此寄存器宽度与其他一些宽度之间可能存在不同的平衡。
一般来说,如果你已经足够提出这些问题了,那么只要目睹在这些条件下生成的不同代码,你就可能获得更多。在所有可能的情况下,通过测量每个的性能和内存消耗,您将获得良好的服务。