考慮下面的代碼:爲什麼GCC優化這個增量?
#include <stdlib.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
uint64_t counter = 0;
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
void sig_handler(int signo) {
printf("%" PRIu64 "\n", counter);
}
int main() {
struct sigaction act;
act.sa_handler = &sig_handler;
sigaction(SIGINT, &act, NULL);
for(;;) {
counter++;
}
return 0;
}
如果我編譯-O0
的代碼,我可以看到,櫃檯被當我按CTR + C遞增。與-O1
,這是優化了。爲什麼是這樣,我怎麼能避免它?
哎呀,我忘了加'volatile'。 – d33tah
這可能是相關的:http://stackoverflow.com/q/15187459/10077 –
在信號處理程序中,如果它們的類型是'volatile sig_atomic_t'(或者其中一個'std :: atomic' C++ 11中的類型)。 –