Tak więc powodem typedef
: ed prymitywne typy danych jest abstrakcja reprezentacji niskiego poziomu i ułatwienie zrozumienia (uint64_t
zamiast long long
typu, który ma 8 bajtów).
Jednak jest to, uint_fast32_t
co ma to samo typedef
co uint32_t
. Czy użycie „szybkiej” wersji przyspieszy program?
Odpowiedzi:
int
na niektórych platformach może mieć nawet 16 bitów. To może być niewystarczające dla Twojej aplikacji.uint32_t
nie ma gwarancji, że będzie istnieć. Jest to opcjonalne,typedef
które implementacja musi zapewnić, jeśli ma typ liczby całkowitej bez znaku równej dokładnie 32-bitom. Niektóre mają na przykład 9-bitowe bajty, więc nie mają rozszerzeniauint32_t
.uint_fast32_t
jasno określa twój zamiar: jest to typ co najmniej 32 bitów, który jest najlepszy z punktu widzenia wydajności.uint_fast32_t
w rzeczywistości może mieć długość 64 bitów. To zależy od wdrożenia.To, na co patrzysz, nie jest standardem. To szczególna implementacja (BlackBerry). Więc nie możesz stąd wywnioskować, że
uint_fast32_t
jest to zawsze to samo, couint32_t
.Zobacz też:
Egzotyczne architektury, o które dbają komitety normalizacyjne .
Mój poglądowy pragmatyczny widok typów całkowitych w C i C ++ .
źródło
uint_least32_t
, która jest taka sama,uint_fast32_t
z wyjątkiem tego, że preferuje mniejszy magazyn niż szybkość.Różnica polega na ich dokładności i dostępności.
Doc tutaj mówi:
I
Różnica jest więc dość wyraźna, że
uint32_t
jest to typ, który ma dokładnie32
bity, a implementacja powinna zapewnić go tylko wtedy, gdy ma typ z dokładnie 32 bitami, a następnie może wpisać ten typ jakouint32_t
. Oznacza to,uint32_t
że może być dostępny lub nie .Z drugiej strony
uint_fast32_t
jest to typ, który ma co najmniej 32 bity, co również oznacza, że implementacja może być zdefiniowanauint32_t
tak,uint_fast32_t
jakby zapewniałauint32_t
. Jeśli nie dostarczauint32_t
, touint_fast32_t
może to być typedef dowolnego typu, który ma co najmniej32
bity.źródło
uint32_t
jest dokładnie 32-bitowy we wszystkich systemach (jeśli istnieje), co może nie być szybsze w porównaniu z, powiedzmy, 64-bitowym.uint_fast32_t
z drugiej strony co najmniej 32-bitowy, może być nawet 64-bitowy.uint16_t x;
zostanie zapisany w 32-bitowym rejestrze w ARM7-TDMI, kodx++;
może wymagać oceny jakox=((x+1)<<16)>>16);
. W kompilatorach dla tej platformyuint_fast16_t
najprawdopodobniej zostanie zdefiniowany jako synonim,uint32_t
aby tego uniknąć.[u]int_(fast|least)N_t
nie są również opcjonalne? Z pewnością nie wszystkie architektury są wymagane przez standard do obsługi pierwotnych typów co najmniej 64-bitowych? Jednak sformułowaniestdint.h
sugeruje, że muszą. Wydaje mi się dziwne, że egzekwujemy to od 1999 r., Kilka lat przed tym, jak 64-bitowe komputery stały się głównym nurtem - nie mówiąc już o opóźnieniu w stosunku do (w wielu przypadkach wciąż aktualnych) architektur wbudowanych. To wydaje mi się dużym niedopatrzeniem.Kiedy jesteś
#include inttypes.h
w swoim programie, masz dostęp do wielu różnych sposobów przedstawiania liczb całkowitych.Typ uint_fast * _t po prostu definiuje najszybszy typ reprezentujący daną liczbę bitów.
Pomyśl o tym w ten sposób: definiujesz zmienną typu
short
i używasz jej kilka razy w programie, co jest całkowicie poprawne. Jednak system, nad którym pracujesz, może działać szybciej z wartościami typuint
. Definiując zmienną jako typuint_fast*t
, komputer po prostu wybiera najbardziej wydajną reprezentację, z jaką może pracować.Jeśli nie ma różnicy między tymi reprezentacjami, system wybiera dowolną z nich i używa jej konsekwentnie przez cały czas.
źródło
Zwróć uwagę, że szybka wersja może być większa niż 32 bity. Podczas gdy szybki int będzie ładnie pasował do rejestru i zostanie wyrównany i tym podobne, ale zużyje więcej pamięci. Jeśli masz duże tablice tych tablic, twój program będzie wolniejszy z powodu większej liczby trafień w pamięci podręcznej i przepustowości.
Nie sądzę, aby nowoczesny CPUS skorzystał na fast_int32, ponieważ generalnie znak rozszerzający się z 32 do 64 bitów może wystąpić podczas instrukcji ładowania, a pomysł, że istnieje „natywny” format liczb całkowitych, który jest szybszy, jest staroświecki.
źródło