Jaka jest różnica między tymi dwoma? Wiem, że int32_t ma dokładnie 32 bity niezależnie od środowiska, ale jak sama nazwa wskazuje, że jest szybki, o ile szybszy może być int_fast32_t w porównaniu do int32_t? A jeśli jest znacznie szybszy, to dlaczego?Różnica między int32_t a int_fast32_t
Odpowiedz
C jest określany w kategoriach wyidealizowanej, abstrakcyjnej maszyny. Jednak rzeczywisty sprzęt ma cechy behawioralne, które nie są uchwycone przez standard językowy. Typy _fast
to aliasy typów, które umożliwiają każdej platformie określenie typów, które są "wygodne" dla sprzętu.
Na przykład, jeśli masz tablicę 8-bitowych liczb całkowitych i chcesz zmutować każdy z nich osobno, byłoby to raczej nieefektywne w przypadku współczesnych komputerów stacjonarnych, ponieważ ich operacje ładowania zwykle wymagają wypełnienia całego rejestru procesora, który jest 32 lub 64-bitowe ("słowo maszynowe"). Tak więc wiele załadowanych danych kończy się marnowaniem, a co ważniejsze, nie można zrównoważyć ładowania i przechowywania dwóch sąsiednich elementów tablicy, ponieważ są one w tym samym słowie maszynowym i dlatego muszą być ładowane-modyfikowane-przechowywane sekwencyjnie.
Typy _fast
są zwykle tak szerokie jak słowo maszynowe, jeśli jest to możliwe. Oznacza to, że mogą one być od Ciebie większe i wymagają więcej pamięci (a tym samym są trudniejsze do buforowania!), Ale twój sprzęt może mieć do nich szybszy dostęp. Wszystko zależy jednak od wzoru użycia. (Np. Tablica o numerze int_fast8_t
prawdopodobnie byłaby tablicą słów maszynowych, a ciasna pętla modyfikująca taką tablicę może znacznie przynieść korzyści).
Jedynym sposobem na sprawdzenie, czy to robi jakąkolwiek różnicę, jest porównanie!
dlaczego mówisz o C++? –
@JensGustedt: Z przyzwyczajenia. Naprawiony! –
Wyjaśniłeś to całkiem dobrze. Dzięki :) –
int32_t
to liczba całkowita, która wynosi dokładnie 32bit. Jest to przydatne, jeśli chcesz na przykład utworzyć strukturę z dokładnym umiejscowieniem w pamięci.
int_fast32_t
to "najszybsza" liczba całkowita dla Twojego obecnego procesora, która jest w końcu większa lub równa int32_t
. Nie wiem, czy naprawdę jest zysk dla obecnych procesorów (x86 lub ARM).
Ale mogę w końcu przedstawić prawdziwy przypadek: pracowałem z 32-bitowym procesorem PowerPC. Podczas uzyskiwania dostępu do źle ustawionych 16-bitów, int16_t
, było to nieefektywne, ponieważ najpierw musiał je ponownie ustawić w jednym z 32-bitowych rejestrów. W przypadku danych nieposiadanych w pamięci, ponieważ nie mieliśmy ograniczeń pamięci, bardziej efektywne było użycie int_fast16_t
(które w rzeczywistości były 32-bitowe int).
Nie sądzę, że odpowiedź, która stawia jeden punkt zainteresowania Dr Evil, jest bardzo przydatna ... co znaczy "najszybszy" *? –
@KerrekSB: Standard po prostu mówi "najszybciej", z przypisem "Określony typ nie jest gwarantowany jako najszybszy dla wszystkich celów, jeśli implementacja nie ma wyraźnych podstaw do wyboru jednego typu na inny, po prostu wybierze typ liczby całkowitej spełniające wymagania dotyczące sygnatury i szerokości. " Sądzę więc, że cytaty są całkiem odpowiednie, ponieważ każdy wdrażający może sam decydować o tym, jak mierzyć "prędkość". 'int_fast32_t' może z łatwością być 32-bitowymi na 64-bitowej implementacji. –
Niestety, spotkanie przerwał pisanie mojej odpowiedzi. Jest teraz kompletny z - miejmy nadzieję - oświecającym przykładem. – Offirmo
- 1. Różnica między obiektem a *?
- 2. Różnica między jquery a $
- 3. Różnica między String [] a i String ... a
- 4. Różnica między bip pid a $$
- 5. Różnica między kodowaniem a sortowaniem?
- 6. Różnica między onbeforeunload a onunload
- 7. Różnica między OpenCV a OpenCL
- 8. Różnica między wysokością a tłumaczeniemZ
- 9. Różnica między ApplicationInfo a PackageInfo?
- 10. Różnica między CMAKE_PROJECT_NAME a PROJECT_NAME?
- 11. Różnica między autoconf a autoreconf
- 12. Różnica między transakcją a transakcjąScope
- 13. Różnica między File.Copy a File.Move
- 14. Różnica między _declspec a __declspec?
- 15. Różnica między repozytorium a usługą?
- 16. Różnica między CCNode a CCLayer?
- 17. różnica między * y ++ a ++ * y?
- 18. Różnica między IPFS a Filecoin?
- 19. Różnica między systemem a shell_exec
- 20. Różnica między Redis a kafka
- 21. Różnica między dodawaniem a dodawaniem
- 22. Różnica między DisplayFor a ValueFor
- 23. Różnica między @EntityScan a @ComponentScan
- 24. Różnica między DataSource a DataSet
- 25. Różnica między LIST_HEAD_INIT a INIT_LIST_HEAD
- 26. Różnica między GetHostEntry a GetHostByName?
- 27. Różnica między Object.getPrototypeOf a __proto__
- 28. Różnica między CHOICE_MODE_MULTIPLE a CHOICE_MODE_MULTIPLE_MODAL?
- 29. Różnica między WebMvcConfigurationSupport a WebMvcConfigurerAdapter
- 30. Różnica między malloc a dlmalloc
O około 50% do 80% szybciej. To naprawdę dość szybki typ. W rzeczywistości jest tak szybki, że zamienia większość algorytmów O (N) w O (N/2). –
'int_fast32_t' jest * najszybszym * dostępnym znakiem typu integer z * co najmniej * 32 bitami. – Maroun
@Kerrek, naprawdę powinieneś umieścić emotikony na końcu humoru, bo jakaś biedna, niczego nie podejrzewająca dusza przyjmuje to jako ewangelię :-) – paxdiablo