我試試你的代碼:
#include <time.h>
struct timespec start, stop;
void main() {
int i;
int size = 1000;
int stride = 1;
char array[size];
clock_gettime(CLOCK_MONOTONIC, &start);
for(i = 0; i < size; i+=stride) { array[i]; }
clock_gettime(CLOCK_MONOTONIC, &stop);
}
然後編譯使用gcc和objdump的dissamble它:
...
4005e1: eb 06 jmp 4005e9 <main+0x8c>
4005e3: 8b 45 dc mov -0x24(%rbp),%eax
4005e6: 01 45 d4 add %eax,-0x2c(%rbp)
4005e9: 8b 45 d4 mov -0x2c(%rbp),%eax
4005ec: 3b 45 d8 cmp -0x28(%rbp),%eax
4005ef: 7c f2 jl 4005e3 <main+0x86>
...
你可以看到,有沒有數組[1]。它只使用我,尺寸和步幅。
它沒有被接受。
就像在命令中任何體面的編譯器都會將其刪除。
取決於編譯器的實現。嘗試反編譯你的編譯器給你的結果。任何合理的優化編譯器都應該知道'array [i]'語句沒有副作用,因此可以安全地放棄。 – cyphar