Szukałem już trochę i nie mam na to odpowiedzi.Jakie są dobre wskazówki dotyczące wyboru rozmiaru typów całkowitych?
Kiedy programuję na urządzeniach wbudowanych z ograniczoną pamięcią, ogólnie mam zwyczaj używania najmniejszego typu integralnego/zmiennoprzecinkowego, który wykona zadanie, na przykład, jeśli wiem, że licznik zawsze będzie od zera do 255, zadeklaruję to jako uint8_t
.
Jednak w środowiskach o ograniczonej ilości pamięci używam po prostu int
do wszystkiego, zgodnie z Google C++ Styleguide. Kiedy patrzę na istniejący kod, często robi się to w ten sposób.
Dla jasności, rozumiem, dlaczego tak się dzieje (Google wyjaśnia to bardzo dobrze), ale nie jestem dokładnie jasny na temat racjonalności tego, co dzieje się w pierwszej kolejności.
Wydaje mi się, że zmniejszenie wielkości pamięci Twojego programu, nawet w systemie, w którym nie zależy Ci na zużyciu pamięci, byłoby dobre dla ogólnej prędkości, ponieważ logicznie, mniej ogólnych danych oznaczałoby więcej jego zmieści się w pamięci podręcznej procesora.
Powikłaniem jest jednak to, że kompilatory automatycznie podają dane i dopasowują je do granic tak, aby można je było pobrać w jednym cyklu magistrali. Sądzę więc, że sprowadza się to do tego, czy kompilatory są wystarczająco inteligentne, aby wziąć, powiedzmy, dwie 32-bitowe liczby całkowite i skleić je razem w jednym bloku 64-bitowym vs. pojedynczo wypełniając każdy z nich do 64 bitów.
Przypuszczam, że sam procesor może to wykorzystać, zależy również od jego wewnętrznych elementów, ale idea, że optymalizacja rozmiaru pamięci poprawia wydajność, szczególnie w przypadku nowszych procesorów, dowodzi fakt, że jądro Linuksa relied for awhile na Opcja gcc -0s
dla ogólnego zwiększenia wydajności.
Sądzę więc, że moje pytanie brzmi, dlaczego metoda Google wydaje się być znacznie bardziej rozpowszechniona w rzeczywistym kodzie. Czy brakuje tu ukrytego kosztu?
Wskazówki dotyczące stylu Google nie uwzględniają programowania wbudowanego i pamięci o ograniczonej dostępie. Lub ograniczona pamięć do wytycznych Google ma tylko gigabajt lub dwie z pamięci. Jeśli programujesz 64 KiB lub 1 MB pamięci, pracujesz w zupełnie innym środowisku niż to przyjęte przez Google. –
Należy również wziąć pod uwagę, że pamięć na stosie jest mniej lub bardziej wolna w małych ilościach, a zapisanie pamięci za pomocą wąskiego typu * może * wymagać od kompilatora wydania większej ilości instrukcji. Jest to myślenie za pomocą 'int', chyba że masz powód, aby tego nie robić, np. Gdy jest to element tablicy lub element struct lub class. – EJP
Czasami większy typ danych jest bardziej wydajny. Na przykład 'double' może dać lepszą wydajność, ponieważ nowoczesne procesory są często zbudowane tak, aby natywnie działały na' double's zamiast 'float's (ale jeśli masz ich tonę, to może' float' będzie lepszy, ponieważ może buforować więcej z nich ...). Również '-Os' optymalizuje liczbę instrukcji, które mają być mniejsze, a nie rozmiar obsługiwanych typów danych; ta flaga jest ortogonalna do twojego pytania. – Cornstalks