LINUX.ORG.RU

История изменений

Исправление 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 (ну и само собой нельзя ей присваивать нигде кроме объявления).