W zlib 1.2.7, plik inffast.c, linia 320, znajduje się stwierdzenie, że nie rozumiem:Dlaczego zlib stara się obliczyć tylko różnicę wskaźnika pozytywnego?
strm->avail_out = (unsigned)(out < end ?
257 + (end - out) : 257 - (out - end));
zmiennych end
i out
są dwa wskaźniki do bufora wyjściowego. To stwierdzenie dokłada wszelkich starań, aby obliczyć end - out
, gdy, 3110 i , gdy out >= end
, ale nie rozumiem, dlaczego może to zrobić. Wydaje mi się, że efekt końcowy jest taki sam, to znaczy, że linia może równie dobrze napisane:
strm->avail_out = 257 + (end - out);
Różnica dwóch wskaźników ma podpisaną integralną typ ptrdiff_t
(C99 6.5.6: 9) i 257
ma typ int
. Dodanie odbywa się w typie wyższego rzędu między tymi dwoma i nie widzę tego, z czym może się przeciwstawić operator trójskładnikowy.
Nie zdziwiłbym się, gdyby słynna przenośność zlib była również możliwa przez * nie * poleganie na określonym zachowaniu, ale raczej na sprawdzeniu, co faktycznie wykonują implementacje. –
Czy istnieje repozytorium kodu źródłowego z wystarczającą historią, aby winić tę linię i sprawdzić, czy powstało ono z innego sformułowania? – Potatoswatter
@Potatoswatter Jedyne co znalazłem to "Historia zmian" w inflate.c "Zmień strm-> next_out [-state-> offset] na * (strm-> next_out - state-> offset), aby uniknąć problemu z negacją Alphas (64-bitowy) w trybie inflate.c ", ale to nie wyjaśnia. Widzę, jak 'p [-o]' może się różnić od '* (p-o)' z 'o' 32-bitowym unsigned int i' p' z 64-bitowym wskaźnikiem. Oświadczenie w moim pytaniu jest czymś innym. –