Код С:
void charTypes(char a)
{
return ;
}
void intType(int a)
{
return ;
}
Сборка:
0000000000000000 <charTypes>:
0: f3 0f 1e fa endbr64
4: 55 push rbp
5: 48 89 e5 mov rbp,rsp
8: 89 f8 mov eax,edi
a: 88 45 fc mov BYTE PTR [rbp-0x4],al
d: 90 nop
e: 5d pop rbp
f: c3 ret
0000000000000010 <intType>:
10: f3 0f 1e fa endbr64
14: 55 push rbp
15: 48 89 e5 mov rbp,rsp
18: 89 7d fc mov DWORD PTR [rbp-0x4],edi
1b: 90 nop
1c: 5d pop rbp
1d: c3 ret
В случае параметра char
, зачем нам нужно назначать edi
для eax
? Что мешает этому?
DWORD PTR [rbp-0x4],dil
-Og
или-O1 -fno-inline-functions
, а чаще всего-O2 -fno-tree-vectorize -fno-unroll-loops
. Не существует способа избежать оптимизации констант и прочего, поэтому вам нужно писать функции, которые принимают аргументы и возвращают результат, или изменяют массив, или что-то еще, что нельзя просто оптимизировать доreturn 1234
. Как удалить шум из вывода сборки GCC/clang? есть несколько предложений и ссылка на выступление Мэтта Годболта. Использование godbolt.org для сопоставления исходных строк с asm очень помогает. - person Peter Cordes   schedule 26.04.2020-fomit-frame-pointer
включен на большинстве уровней оптимизации. Те инструкции в каждой функции, которые устанавливают RBP в качестве указателя кадра, а затем разрывают кадр стека, не являются специальными или необходимыми, RBP — это просто обычный регистр. Здесь нет никакой магии. x86_64: указатель фрейма стека почти бесполезен?. Если вы скомпилируете целую программу и выполните пошаговое выполнение ассемблера с помощью отладчика (например, gdblayout reg
), вы увидите инструкции, которые действительно выполняются. - person Peter Cordes   schedule 27.04.2020