#c #gcc #assembly
#c #gcc #сборка
Вопрос:
Привет, мне было интересно, какой ассемблерный код gcc сгенерирует из этого кода (это просто фиктивный код для иллюстрации моей точки зрения):
int a = 0;
int foo(void)
{
int result = a;
a = 2;
return resu<
}
Я был удивлен, что gcc копирует переменную a в стек, а затем из стека в регистр, чтобы он мог ее вернуть. Когда я добавил register к объявлению результата, это оптимизировало код, чтобы не использовать стек, а вместо этого скопировать переменную непосредственно в регистр. Я знаю, что на самом деле это не имеет никакого значения, но мне было интересно, есть ли какая-либо веская причина, по которой gcc не выполняет такую оптимизацию неявно. Надеюсь, я ясно объяснил, о чем говорю…
Есть идеи?
Комментарии:
1. Вы должны предоставить версию компилятора, командные строки и выходные данные сборки.
2. 1 за замечание Паскаля. Когда речь заходит о таких особенностях, как оптимизация компилятора, предоставьте людям здесь как можно больше контекста. (Тем не менее, мне кажется, что вы использовали не самые агрессивные оптимизации.)
3. Наиболее важной частью здесь, вероятно, является то, скомпилировали ли вы этот код с включенной оптимизацией или без нее
Ответ №1:
При компиляции отладочных сборок (т. Е. без оптимизации) компиляторы, как правило, создают очень простой, легко отлаживаемый код. В этом случае это может означать сохранение всех переменных в памяти / стеке, а не в регистрах.
Попробуйте скомпилировать с полной оптимизацией (-O3) и посмотрите, поможет ли это.