История изменений
Исправление KivApple, (текущая версия) :
Компилятор скорее всего оптимизирует код и в итоге локальная переменная исчезнет (точнее она всегда будет заменяться глобальной), поэтому оверхеда не будет. Главное не описывай её как volatile (сам указатель, значение по указателю вполне может быть таковым), а ещё лучше опиши как const (ну и само собой нельзя ей присваивать нигде кроме объявления).
Вот, например, такой код:
extern int a;
void g(int a, int *b);
void f() {
int *b = &a;
*b = 10;
g(*b, b);
(*b)++;
}
Превращается в это:
f:
subq $8, %rsp
movl $a, %esi <-- второй аргумент функции g
movl $10, %edi <-- первый аргумент функции g
movl $10, a(%rip) <-- присваивание a значения
call g
addl $1, a(%rip) <-- инкремент переменной a
addq $8, %rsp
ret
Можно заметить, что переменная b испарилась и все обращения идут напрямую к a.
Разумеется, я компилировал с включенными оптимизациями (-O2).
Исправление KivApple, :
Компилятор скорее всего оптимизирует код и в итоге локальная переменная исчезнет (точнее она всегда будет заменяться глобальной), поэтому оверхеда не будет. Главное не описывай её как volatile (сам указатель, значение по указателю вполне может быть таковым), а ещё лучше опиши как const (ну и само собой нельзя ей присваивать нигде кроме объявления).
Вот, например, такой код:
extern int a;
void g(int a, int *b);
void f() {
int *b = &a;
*b = 10;
g(*b, b);
(*b)++;
}
Превращается в это:
f:
subq $8, %rsp
movl $a, %esi <-- второй аргумент функции g
movl $10, %edi <-- первый аргумент функции g
movl $10, a(%rip) <-- присваивание a значения
call g
addl $1, a(%rip) <-- инкремент переменной a
addq $8, %rsp
ret
Можно заметить, что переменная b испарилась и все обращения идут напрямую к a.
Исходная версия KivApple, :
Компилятор скорее всего оптимизирует код и в итоге локальная переменная исчезнет (точнее она всегда будет заменяться глобальной), поэтому оверхеда не будет. Главное не описывай её как volatile (сам указатель, значение по указателю вполне может быть таковым), а ещё лучше опиши как const (ну и само собой нельзя ей присваивать нигде кроме объявления).