Więc mam dwie funkcje, jedna po prostu rzuca od double
do int64_t
, pozostałe połączenia std::round
:Zrozumienie podwójnej konwersji do int64_t
std::int64_t my_cast(double d)
{
auto t = static_cast<std::int64_t>(d);
return t;
}
std::int64_t my_round(double d)
{
auto t = std::round(d);
return t;
}
one działają poprawnie: cast(3.64)
= 3
i round(3.64)
= 4
. Ale kiedy patrzę na zgromadzenie, wydają się robić to samo. Zastanawiam się, w jaki sposób osiągają różne wyniki?
$ g++ -std=c++1y -c -O3 ./round.cpp -o ./round.o
$ objdump -dS ./round.o
./round.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z7my_castd>:
0: f2 48 0f 2c c0 cvttsd2si %xmm0,%rax
5: c3 retq
6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
d: 00 00 00
0000000000000010 <_Z8my_roundd>:
10: 48 83 ec 08 sub $0x8,%rsp
14: e8 00 00 00 00 callq 19 <_Z7my_castd+0x19> <========!!!
19: 48 83 c4 08 add $0x8,%rsp
1d: f2 48 0f 2c c0 cvttsd2si %xmm0,%rax
22: c3 retq
Disassembly of section .text.startup:
0000000000000030 <_GLOBAL__sub_I__Z7my_castd>:
30: 48 83 ec 08 sub $0x8,%rsp
34: bf 00 00 00 00 mov $0x0,%edi
39: e8 00 00 00 00 callq 3e <_GLOBAL__sub_I__Z7my_castd+0xe>
3e: ba 00 00 00 00 mov $0x0,%edx
43: be 00 00 00 00 mov $0x0,%esi
48: bf 00 00 00 00 mov $0x0,%edi
4d: 48 83 c4 08 add $0x8,%rsp
51: e9 00 00 00 00 jmpq 56 <_Z8my_roundd+0x46>
nie jestem pewien, jaki jest cel tej callq
na linii 14
jest, ale nawet z tym, my_cast
i my_round
wydają się być po prostu robi cvttsd2si
, które moim zdaniem jest konwersja z obcięcia.
Jednak te dwie funkcje, jak już wspomniano wcześniej, wytwarzają różne (poprawnie) wartości tego samego wejścia (słownie 3.64
)
Co się dzieje?
Należy zauważyć, że runda (x) = obcięcie (x + 0,5). Podejrzewam, że nie zidentyfikowałeś tutaj wszystkich kodów maszynowych. –
GCC 5.3.0 wywołuje wywołanie 'round' https://gcc.godbolt.org/ @ Cheersandhth.-Alf, które odnosi się tylko do nieujemnych wartości –
' callq 19' to nierozwiązane jeszcze odniesienie do 'std: : round'. Zostanie wypełniony, gdy obiekt zostanie połączony. –