Gdzie znajdę definicję rozmiaru t? [duplikat]
To pytanie ma już odpowiedź tutaj:
- Jaka jest różnica między size_t A int w C++? 5 odpowiedzi
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.).
9 answers
Pliki nagłówkowe
stdlib.h
istddef.h
definiują typ danych o nazwiesize_t
1 który jest używany do reprezentowania wielkości obiektu. Funkcje biblioteczne przyjmujące rozmiary oczekują, że będą typusize_t
, a operator sizeof ocenia nasize_t
.Rzeczywisty typ
size_t
jest zależny od platformy; częstym błędem jest założenie, żesize_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.
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
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.)
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>
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ą".
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ęzykasizeof
i jest zdefiniowany w pliku nagłówkowym<cstring>
(m.in.) jako niepodpisany Typ integralny.W
<cstring>
, jest używany jako typ parametrunum
w funkcjachmemchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
istrxfrm
, 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
istrxfrm
, aby zwrócić rozmiary i długości.
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.
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 bibliotekivmalloc
, 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.
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.)
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, typedef
d 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.
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