Код - Разница в том, что один метод предназначен для коротких int со знаком, а другой для коротких int без знака.
short signedShortIntSwap(short int* a , short int* b)
{
short tmp = *a;
*a = *b;
*b = tmp;
return *a;
}
unsigned short unsignedShortIntSwap(unsigned short int* a ,unsigned short int* b)
{
unsigned short tmp = *a;
*a = *b;
*b = tmp;
return *a;
}
Сборка: - gcc -c -m64 -o func1 func1.c -O2 -fno-tree-vectorize
0000000000000000 <signedShortIntSwap>:
0: f3 0f 1e fa endbr64
4: 0f b7 07 movzx eax,WORD PTR [rdi]
7: 0f b7 16 movzx edx,WORD PTR [rsi]
a: 66 89 17 mov WORD PTR [rdi],dx
d: 66 89 06 mov WORD PTR [rsi],ax
10: 0f b7 07 movzx eax,WORD PTR [rdi]
13: c3 ret
14: 66 66 2e 0f 1f 84 00 data16 nop WORD PTR cs:[rax+rax*1+0x0]
1b: 00 00 00 00
1f: 90 nop
0000000000000020 <unsignedShortIntSwap>:
20: f3 0f 1e fa endbr64
24: 0f b7 07 movzx eax,WORD PTR [rdi]
27: 0f b7 16 movzx edx,WORD PTR [rsi]
2a: 66 89 17 mov WORD PTR [rdi],dx
2d: 66 89 06 mov WORD PTR [rsi],ax
30: 0f b7 07 movzx eax,WORD PTR [rdi]
33: c3 ret
34: 66 66 2e 0f 1f 84 00 data16 nop WORD PTR cs:[rax+rax*1+0x0]
3b: 00 00 00 00
3f: 90 nop
- Почему у нас
movzx eax,WORD PTR [rdi]
повторяется для каждой функции по адресу 4
&& 10
и 24
&& 30
. - Почему для функции как со знаком, так и без знака есть одинаковый набор команд. В каком случае это отличается?