Jaka jest różnica między rozmiarem T A int w C++?

W kilku przykładach C++ widzę użycie typu size_t gdzie użyłbym prostego int. Co za różnica i dlaczego {[0] } powinno być lepiej?

 181
Author: abhi, 2009-02-02

5 answers

Z przyjaznej Wikipedii :

Stdlib.h i stddef.pliki nagłówkowe H definiują typ danych o nazwie size_t, który jest używany do reprezentowania rozmiaru obiektu. Funkcje biblioteczne przyjmujące rozmiary oczekują, że będą typu size_t, a operator sizeof ocenia do size_t.

Rzeczywisty typ size_t jest zależny od platformy; częstym błędem jest założenie, że size_t jest taki sam jak niepodpisana liczba całkowita, co może prowadzić do błędów programistycznych, szczególnie w przypadku 64-bitowych architektury stają się bardziej powszechne.

Sprawdź również Dlaczego rozmiar ma znaczenie

 159
Author: Joao da Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Size_t jest typem używanym do reprezentowania rozmiarów (jak sugeruje jego nazwa). Jego platforma (a nawet potencjalnie implementacja) zależna i powinna być używana tylko w tym celu. Oczywiście, reprezentując rozmiar, size_t jest niepodpisane. Wiele funkcji stdlib, w tym malloc, sizeof i różne funkcje operacji łańcuchowych, używa size_t jako typu danych.

Int jest domyślnie podpisany i chociaż jego rozmiar jest również zależny od platformy, będzie to stałe 32-bitowe na większości nowoczesnych maszyn (i choć size_t wynosi 64 bity na architekturze 64-bitowej, int pozostaje 32 bity na tych architekturach).

Podsumowując: użyj size_t do reprezentowania rozmiaru obiektu i int (lub long) w innych przypadkach.

 36
Author: Axelle Ziegler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 11:48:12

Typ size_t jest zdefiniowany jako niepodpisany Typ całkowy operatora sizeof. W świecie rzeczywistym na platformach 64-bitowych często zobaczysz int zdefiniowane jako 32 bity (dla kompatybilności wstecznej), ale size_t zdefiniowane jako 64 bity (dzięki czemu możesz deklarować tablice i struktury o rozmiarze większym niż 4 GiB). Jeśli long int jest również 64-bitowa, nazywa się to konwencją LP64; Jeśli long int jest 32-bitowa, ale long long int i wskaźniki są 64-bitowe, to jest to LLP64. Możesz również uzyskać odwrotny, program, który wykorzystuje 64-bitowy instrukcje dotyczące szybkości, ale 32-bitowe wskaźniki do zapisywania pamięci. Ponadto {[2] } jest podpisane, a size_t jest niepodpisane.

Historycznie było wiele innych platform, gdzie adresy były szersze lub krótsze niż rozmiar natywny int. W rzeczywistości w latach 70. i na początku lat 80. było to bardziej powszechne: wszystkie popularne mikrokomputery 8-bitowe miały 8-bitowe rejestry i 16-bitowe adresy, a przejście między 16 A 32 bitami spowodowało również wiele maszyn, które miały adresy szersze niż ich rejestry. Czasami wciąż widzę tutaj pytania o Borland Turbo C dla MS-DOS, którego ogromny tryb pamięci miał 20-bitowe adresy przechowywane w 32 bitach na 16-bitowym procesorze (ale który mógł obsługiwać 32-bitowy zestaw instrukcji 80386); Motorola 68000 miała 16-bitowe ALU z 32-bitowymi rejestrami i adresami; były mainframe IBM z 15-bitowymi, 24-bitowymi lub 31-bitowymi adresami. W systemach wbudowanych nadal widać różne rozmiary ALU i magistrali adresowej.

Dowolny czas int jest mniejszy od size_t, i próbujesz zapisać rozmiar lub przesunięcie bardzo dużego pliku lub obiektu w unsigned int, istnieje możliwość, że może on przepełnić się i spowodować błąd. Z int Istnieje również możliwość uzyskania liczby ujemnej. Jeśli int lub unsigned int jest szerszy, program będzie działał poprawnie, ale marnuje pamięć.

Powinieneś zazwyczaj używać odpowiedniego typu do tego celu, jeśli chcesz przenośności. Wiele osób poleci użycie podpisanej matematyki zamiast niepodpisanej (aby uniknąć nieprzyjemnych, subtelne błędy jak 1U < -3). W tym celu biblioteka standardowa definiuje ptrdiff_t W <stddef.h> jako podpisany Typ wyniku odejmowania wskaźnika od innego.

To powiedziawszy, obejściem może być ograniczenie-sprawdź wszystkie adresy i offsety pod kątem INT_MAX i 0 lub INT_MIN odpowiednio, i włącz ostrzeżenia kompilatora o porównywaniu podpisanych i niepodpisanych ilości w przypadku, gdy je przeoczysz. Powinieneś zawsze, zawsze, zawsze sprawdzać dostęp do tablicy pod kątem przepełnienia w C w każdym razie.

 13
Author: Davislor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 08:06:11

To dlatego, że size_t może być czymkolwiek innym niż int (być może struct). Chodzi o to, że oddziela to zadanie od podstawowego typu.

 8
Author: graham.reeds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 11:06:29

Definicja SIZE_T znajduje się na: https://msdn.microsoft.com/en-us/library/cc441980.aspx i https://msdn.microsoft.com/en-us/library/cc230394.aspx

Wklejenie tutaj wymaganych informacji:

SIZE_T jest ULONG_PTR reprezentującą maksymalną liczbę bajtów, na które może wskazywać wskaźnik.

Ten typ deklaruje się następująco:

typedef ULONG_PTR SIZE_T;

A ULONG_PTR jest niepodpisanym długim typem używanym do precyzji wskaźnika. Stosowany jest przy odlewaniu wskaźnik do typu long do wykonywania arytmetyki wskaźnika.

Ten typ deklaruje się następująco:

typedef unsigned __int3264 ULONG_PTR;
 -1
Author: sundar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 04:03:30