2013-04-23 7 views
6

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

+16

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). –

+4

'int_fast32_t' jest * najszybszym * dostępnym znakiem typu integer z * co najmniej * 32 bitami. – Maroun

+4

@Kerrek, naprawdę powinieneś umieścić emotikony na końcu humoru, bo jakaś biedna, niczego nie podejrzewająca dusza przyjmuje to jako ewangelię :-) – paxdiablo

Odpowiedz

17

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!

+0

dlaczego mówisz o C++? –

+0

@JensGustedt: Z przyzwyczajenia. Naprawiony! –

+0

Wyjaśniłeś to całkiem dobrze. Dzięki :) –

8

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).

+0

Nie sądzę, że odpowiedź, która stawia jeden punkt zainteresowania Dr Evil, jest bardzo przydatna ... co znaczy "najszybszy" *? –

+0

@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. –

+0

Niestety, spotkanie przerwał pisanie mojej odpowiedzi. Jest teraz kompletny z - miejmy nadzieję - oświecającym przykładem. – Offirmo