我想为将在不同 MCU(16 位、32 位或 64 位基础)上运行的应用程序编写可移植代码。
- MSP-430
- nRF52(32 位)
- PIC(16 位)
- C51(8 位)
让我们考虑这个片段:
events = 0;
for (size_t i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
if (array[i] > threshold)
events++;
}
我的问题涉及循环计数器变量的类型,这里是size_t
.
通常size_t
应该足够大以解决我系统的所有内存。所以使用size_t
可能会影响我的代码在某些架构上的性能,因为这个变量的宽度对于我拥有的数组的长度来说太大了。
有了这个假设,我应该更好地使用uint_fast16_t
,因为我知道我array
的元素少于 65k。
关心这篇文章是否有意义,或者我的编译器是否足够聪明来优化它?
我认为uint_fast16_t
与size_t
.
更具体地说明我的问题:
我是通过系统地为我的循环计数器(uint_fast8_t
, uint_fast16_t
, ...)使用正确的类型来提高我的代码的可移植性,还是我应该更喜欢使用size_t
,因为在大多数情况下它不会在性能方面产生任何差异?
编辑
根据您的评论和评论,很明显大多数情况下,编译器会注册循环计数器,因此在两者之间进行选择size_t
或uint_fast8_t
无关紧要。
main: # @main
mov rax, -80
mov ecx, dword ptr [rip + threshold]
.LBB0_1: # =>This Inner Loop Header: Depth=1
[....]
.LBB0_5: # in Loop: Header=BB0_1 Depth=1
add rax, 8 # <----------- Kept in a register
jne .LBB0_1
jmp .LBB0_6
.LBB0_2: # in Loop: Header=BB0_1 Depth=1
[....]
.LBB0_6:
xor eax, eax
ret
如果循环长度变得大于内部 CPU 寄存器,例如在 8 位微控制器上执行 512 个循环,这个问题可能会成为一个真正的问题。