Gdzie znajdę definicję rozmiaru t? [duplikat]

To pytanie ma już odpowiedź tutaj:

Widzę zmienne zdefiniowane w tym typie, ale nie wiem skąd pochodzi, ani jaki jest jego cel. Dlaczego nie użyć int lub unsigned int? (A co z innymi "podobnymi" typami? Void_t itp.).

 102
Author: Eliseo Ocampos, 2009-07-13

9 answers

ZWikipedii

Pliki nagłówkowe stdlib.h i stddef.h definiują typ danych o nazwie size_t1 który jest używany do reprezentowania wielkości obiektu. Funkcje biblioteczne przyjmujące rozmiary oczekują, że będą typu size_t, a operator sizeof ocenia na size_t.

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

Z C99 7.17.1/2

Następujące typy i makra są zdefiniowane w standardowym nagłówku stddef.h

size_t

Który jest typem unsigned integer wyniku operatora sizeof

 105
Author: Martin Liversage,
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
2015-06-22 19:38:37

size_t jest niepodpisaną liczbą całkowitą wyniku operatora sizeof (ISO C99 sekcja 7.17.)

Operator sizeof otrzymuje rozmiar (w bajtach) swojego operandu, który może być wyrażenie lub nazwa typu w nawiasie. Wielkość zależy od rodzaju operand. Wynikiem jest liczba całkowita. Wartość wyniku jest zdefiniowana implementacyjnie, a jego typ (unsigned integer type) to size_t (ISO C99 sekcja 6.5.3.4.)

 22
Author: fpmurphy1,
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
2013-07-24 10:07:22

Zgodnie z opisem size_t na en.cppreference.com size_t jest zdefiniowany w następujących nagłówkach:

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>
 20
Author: stefanB,
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
2013-04-03 00:04:19

Praktycznie rzecz biorąc size_t reprezentuje liczbę bajtów, które możesz adresować. Na większości nowoczesnych architektur w ciągu ostatnich 10-15 lat było to 32 bity, które również były wielkości niepodpisanej liczby całkowitej. Przenosimy się jednak na adresację 64-bitową, podczas gdy uint najprawdopodobniej pozostanie na 32-bitowej (jej rozmiar nie jest gwarantowany w standardzie c++). Aby Kod zależny od wielkości pamięci był przenośny na różnych architekturach, powinieneś użyć size_t. Na przykład rzeczy takie jak rozmiary tablic powinny jeśli spojrzysz na standardowe kontenery, ::size() zawsze zwraca size_t.

Należy również pamiętać, że visual studio ma opcję kompilacji, która może sprawdzać tego typu Błędy o nazwie "Wykrywanie problemów z przenośnością 64-bitową".

 4
Author: Matt Price,
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-07-13 13:52:05

W ten sposób zawsze wiesz, jaki jest rozmiar, ponieważ konkretny typ jest dedykowany rozmiarom. Samo pytanie pokazuje, że może to być problem: czy jest to int Czy unsigned int? Ponadto, jaka jest wielkość (short, int, long, itd.)?

Ponieważ jest przypisany konkretny typ, nie musisz się martwić o długość lub podpisane-ness.

[25]}rzeczywista definicja znajduje się w C++ Reference Library , która mówi:

Type: size_t (Unsigned Typ całkowy)

Header: <cstring>

size_t odpowiada typowi danych integral zwracanemu przez operator języka sizeof i jest zdefiniowany w pliku nagłówkowym <cstring> (m.in.) jako niepodpisany Typ integralny.

W <cstring>, jest używany jako typ parametru num w funkcjach memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy i strxfrm, który we wszystkich przypadkach jest używany do określenia maksymalnej liczby bajtów lub znaków, które ma funkcja aby wpływać.

Jest również używany jako typ powrotu dla strcspn, strlen, strspn i strxfrm, aby zwrócić rozmiary i długości.

 2
Author: lavinio,
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-07-13 13:20:01

Size_t powinien być zdefiniowany w nagłówkach biblioteki standardowej. Z mojego doświadczenia wynika, że zwykle jest to typedef do unsigned int. Chodzi jednak o to, że nie musi tak być. Typy takie jak size_t pozwalają dostawcy bibliotek standardowych na swobodną zmianę podstawowych typów danych, jeśli jest to właściwe dla danej platformy. Jeśli założysz, że size_t jest zawsze niepodpisaną liczbą całkowitą( poprzez casting, itp.), możesz napotkać problemy w przyszłości, jeśli twój dostawca zmieni size_t na np. typ 64-bitowy. To niebezpieczne. aby założyć cokolwiek o tym lub innym typie biblioteki z tego powodu.

 2
Author: Ryan,
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-07-13 13:21:58

Nie jestem zaznajomiony z void_t z wyjątkiem wyniku wyszukiwania Google (jest on używany w A vmalloc biblioteka kiem-Phong VO w AT&T Research - jestem pewien, że jest używany również w innych bibliotekach).

Różne typy xxx_t są używane do abstrakcji typu z określonej implementacji, ponieważ konkretne typy używane do pewnych rzeczy mogą się różnić w zależności od platformy. Na przykład:

  • size_t abstrakuje typ używany do przechowywania wielkości obiektów ponieważ w niektórych systemach będzie to wartość 32-bitowa, w innych może to być 16-bitowa lub 64-bitowa.
  • Void_t abstrahuje typ wskaźnika zwracanego przez procedury biblioteki vmalloc, ponieważ został napisany do pracy w systemach, które przed datą ANSI/ISO C mogą nie istnieć. Przynajmniej tak sądzę.
  • wchar_t streszcza typ używany dla szerokich znaków, ponieważ w niektórych systemach będzie to typ 16-bitowy, w innych będzie to typ 32-bitowy.

Więc jeśli napisz swój szeroki kod obsługi znaków, aby użyć typu wchar_t zamiast, powiedzmy unsigned short, ten kod prawdopodobnie będzie bardziej przenośny na różne platformy.

 1
Author: Michael Burr,
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-07-14 06:27:28

W minimalistycznych programach, w których definicja size_t nie została załadowana "przypadkiem" w niektórych include, ale nadal potrzebuję jej w jakimś kontekście (na przykład, aby uzyskać dostęp do std::vector<double>), wtedy używam tego kontekstu, aby wyodrębnić właściwy typ. Na przykład typedef std::vector<double>::size_type size_t.

(Surround with namespace {...} jeśli jest to konieczne, aby Zakres był ograniczony.)

 1
Author: alfC,
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
2013-08-09 19:12:00

Jak dla "Why not use int or unsigned int?", po prostu dlatego, że jest semantycznie bardziej znaczące, aby nie. Jest praktyczny powód, że może być, powiedzmy, typedefd jako int, a następnie uaktualniony do long później, bez konieczności zmiany kodu, oczywiście, ale bardziej zasadniczo niż to, że typ ma znaczenie. Aby znacznie uprościć, zmienna typu size_t jest odpowiednia dla i używana dla, zawierająca rozmiary rzeczy, podobnie jak {[4] } jest odpowiednia dla zawierająca czas wartości. To, w jaki sposób są one faktycznie wdrażane, powinno być zadaniem wdrożenia. W porównaniu do wywoływania wszystkiego int, używanie znaczących nazw typów, takich jak ta, pomaga wyjaśnić znaczenie i intencję programu, tak jak robi to każdy bogaty zestaw typów.

 1
Author: Paul Griffiths,
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
2013-08-09 21:54:26