Hmm, dlaczego ludzie używają sizet zamiast inta? Przykładowo widzę jakiś szablon pojemnika, który ma przechowywać N elementów jakiegośtam typu. No to myk myk , natomiast zamiast int N widzę sizet N. Czemu? Przecież i tak potem w środku w konstruktorze tworzymy tablicę typu T z liczbą elementów [N], więc dostosuje rozmiar każdego elementu tablicy do typu T jakikolwiek by nie był.
@Khaine: Brakuje tu kontekstu, ale ogółem int na większości architektur największą wartość równą 2³¹-1, a size_t znacznie większą. No i jest jasna implikacja, ƶe ta wartość musi być nieujemna
Stosuje się sizet dla przenośności kodu. Standard gwarantuje, że sizet jest wystarczająco duże, żeby opisać rozmiar dowolnego obiektu lub tablicy obiektów[1]. Int ani unsigned int takiej gwarancji nie mają, standard gwarantuje[2] że int ma 16 lub więcej bitów (na 32bit) lub 32 lub więcej bitów (na 64bit). TLDR: jeśli liczysz jabłka używasz int, jeśli przechowujesz rozmiar obiektu lub tablicy obiektów, stosujesz size_t. [1] http://en.cppreference.com/w/cpp/types/size_t [2] http://en.cppreference.com/w/cpp/language/types
@Khaine: nie tylko, chodzi też o koncepcje wydzielonego typu danych na wielkość zbiorów danych i powinien być używany tylko w tym celu, mimo że technicznie mógłby być zamiennikiem uinta
@KrzaQ2: Szablon klasy pojemnikowej o pojemności N. Czemu powinienem użyć sizet jeśli obiekt typu sizet mówi tylko ile elementów ma tablica wewnątrz klasy?
@KrzaQ2: Czyli innymi słowy size t daje nam w tym wypadku zakres maksymalnej liczby obsługiwanej przez daną architekturę, tak? Bo możemy mieć nie wiem, obiekt który ma ileśtam gigabajtów, to jak damy sizeof na niego, to cyferki będą znaczne.
@KrzaQ2: No to nie chodzi nam o nic innego niż wielkość przechowywanej w size t liczby w tym wypadku. Nie interesuje nas rozmiar w pamięci tego pojemnika, tylko liczba elementów typu T jaka siedzi w środku.
Rozmiar tablicy i ilość elementów są powiązane. Przykładowo, hipotetycznie może istnieć zgodny ze standardem kompilator generujący kod pod architekturę 32 bitową, w którym sizeof(int) == 16. Próba zrobienia tablicy charów o rozmiarze 2^17, przy wykorzystaniu int ileelementow = 1<<17, skończy się bardzo nieprzyjemnym błędem integer overflow, w trakcie debugowanie którego można się spodziewać że ileelementów będzie miała nieprzewidywalną wartość, np ujemną.
@Khaine: Nie - chodzi o czytelność i uniezależnienie od int, które wg starego standardu może mieć od 8 bitów w górę, a wg nowego standardu od 16 bitów w górę.
@klupek: tak, a jak część danych składowana jest np na dysku? Dodatkowo przy systemie 32 bitowym, nawet jeśli int masz zdefiniowany jako 16 bitowy, to adresowanie dalej masz 32 bitowe....
Hmm, dlaczego ludzie używają sizet zamiast inta? Przykładowo widzę jakiś szablon pojemnika, który ma przechowywać N elementów jakiegośtam typu. No to myk myk , natomiast zamiast int N widzę sizet N. Czemu? Przecież i tak potem w środku w konstruktorze tworzymy tablicę typu T z liczbą elementów [N], więc dostosuje rozmiar każdego elementu tablicy do typu T jakikolwiek by nie był.
intna większości architektur największą wartość równą 2³¹-1, asize_tznacznie większą. No i jest jasna implikacja, ƶe ta wartość musi być nieujemnasize_tjest krótsze niżunsigned int:)TLDR: jeśli liczysz jabłka używasz int, jeśli przechowujesz rozmiar obiektu lub tablicy obiektów, stosujesz size_t.
[1] http://en.cppreference.com/w/cpp/types/size_t
[2] http://en.cppreference.com/w/cpp/language/types
size_tgwarantuje, ƶe to nie typ liczbowy będzie ograniczeniem wielkości takiej tablicy.