2008-09-20 11 views
14

Dlaczego nie ma standardowej c funkcję memswap, który prawdopodobnie będzie wyglądać następująco:Dlaczego nie istnieje standardowa funkcja memswap

int memswap(void *ptr1, void *ptr2, size_t nbytes)? 

wiem, że to będzie łatwe do napisania, ale myślę, libc może zrobić niesamowite sztuczki, aby przyspieszyć, jak niektóre implementacje robią to dla memcpy.

Odpowiedz

6

To nie jest coś, co jest rutynowo wymagane.

Pomysły mogły zostać rozważone i odrzucone, ponieważ trudno jest wymyślić algorytm, który ma ogólny cel. Nie zapominaj, że C jest starym językiem, a rozszerzenia muszą być ogólnie przydatne.

możliwych warunków błędu: -

  • zachowanie podczas zakresy są zamienione pokrywają
  • długość zerową
  • wyczerpaniu pamięci (optymalną realizację może przydzielić pamięci to zrobić)
  • NULL wskaźnik

Algorytm najlepszy m może również zależeć od tego, co robisz, a więc być lepiej kodowane bezpośrednio przez ciebie.

  • ciężkich struktur, które mogą być szybciej pomocą struktury temp i przypisanie
  • małych długościach - mogą być lepiej alokacji pamięci tymczasowej
  • długich odcinków - „punkt” przez sekcję zamiany (gdzie przekrój jest optymalną, długość)
  • użycie funkcji kopiowania sprzętowego
+3

Najlepszy algorytm niekoniecznie musi być twój.GCC ma 'memset' jako słowo kluczowe, i na podstawie tego, co to jest, w którym zapisujesz, może opuścić wywołanie funkcji lub mieć pętlę for lub mieć rozwiniętą pętlę for itp. Kompilatory są teraz inteligentne. – Claudiu

+0

Naturalne wyniki to: nakładanie się -> UB, długość == 0 -> no-op, powinno być na miejscu, prawdopodobnie przy użyciu ustalonej ilości stosów, zerowa wskazówka -> UB. Nic w tym dziwnego. – Deduplicator

+0

Zgadzam się, że najlepszy algorytm może zależeć od tego, co robisz, ale możesz również napisać tę funkcję 'memswap' bez bufora dynamicznego, kopiowanie char-by-char (sizeof (char) = 1byte) – Zorgatone

2

Prawdopodobnie dlatego, że nie jest to konieczne bardzo często - często stosuję memcpy i memcpy, ale nie wiem, czy kiedykolwiek używałbym memswap, gdyby była dostępna.

10

Myślę, że ponieważ nie jest to konieczne bardzo często. Istnieje jednak prosty sposób, aby to zrobić w C++:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + nbytes, ptr2) 

To nie może być tak zoptymalizowany jako kompilatora zbudowany, ale ma potencjał bycia szybciej niż pętli piszesz dla siebie, ponieważ może nie mieć optymalizacji zależnej od platformy, której nie można wdrożyć.

Musisz uważać na powyższe, ponieważ zakłada, że ​​ptr1 i ptr2 są znakami char. Im bardziej kanoniczny sposób to zrobić:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + num_items, ptr2) 
2

To prawdopodobnie nie jest bardzo często wymaga programowania C, C++, gdzie wymiany to normalna rzecz do zrobienia na członków klasy istnieje algorytm std::swap który jest zoptymalizowany dla różne rodzaje.

-2

czy patrzyłeś na wymaz?

wacikiem

+2

Tak, ale ta funkcja robi coś innego. Kopiuje zawartość pierwszej tablicy do drugiej i zamienia kolejność bajtów w tym samym czasie. – quinmars

Powiązane problemy