我认为当我们写arr[i]
(相当于*(arr+i)
)时会发生内部强制转换。因为i
例如可以是short
,int
或long
或这三者中任何一个的无符号变体。
所以我的问题很简单:i
应该是哪种类型,以便不进行内部转换?这样代码可以最有效地运行吗?
粗猜:size_t
?
答案 0 :(得分:3)
不太可能对性能产生任何重大影响。在任何情况下,您应始终使用语义正确的类型,而不是尝试对不重要的事情进行过早优化。对于索引,size_t
是先验正确的最小类型,但是如果您知道正在使用的数组是有界的,那么您可以使用较小的类型。通常你应该使用size_t
来保证安全。
答案 1 :(得分:2)
我的回答是保持这个简单,也许你想要typedef
类型为你索引
typedef size_t TPtrIdx;
通过这种方式,您可以轻松地将类型转换为您想要的类型,现在或1年后。
关于从/到有符号和无符号类型的转换之间的潜在问题,这是一个好的编译器可以为您处理的事情,例如gcc
提供-Wconversion
标志,并且总是一件好事启用它。