在这里已经有人问过,C语言中是否允许使用负索引,但我好奇的是,频繁使用这种技术是否会有任何性能上的劣势。例如,它是否会在某些硬件平台上破坏编译器使用基址+offset索引的能力,或者混淆优化器等。
我之所以问这个问题,是因为我有很多带有以下签名的解码例程:
decode_something(char *buffer, int buffer_size, int bit_position) {
...
if (((bit_position + need_bits) >> 3) < buffer_size) {
x= buffer[bit_position >> 3] ...
bit_position += need_bits;
...
}
后来我意识到,如果使用指向缓冲区末尾的指针,我可以大大简化所有代码:
decode_something(char *buf_limit, int bits_remaining) {
...
if (need_bits <= bits_remaining) {
x= buf_limit[ -((bits_remaining+7) >> 3) ];
bits_remaining -= need_bits;
...
}
foo[bar]
只是*(foo + bar)
的简写。无论bar
是正数还是负数都不应该有任何影响。个人而言,我认为明确地使用指针算术而不是使用索引会使您的代码更清晰,但我想这只是个人偏好。 - Roflcopter4*(foo + (-bar))
不是相同的AST,可能会错过某种优化。 - M Conrad