Wpis z mikrobloga

#programowanie #cpp

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ł.
  • 32
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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
  • Odpowiedz
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
  • Odpowiedz
@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?
  • Odpowiedz
@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.
  • Odpowiedz
@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.
  • Odpowiedz
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ą.
  • Odpowiedz
@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ę.
  • Odpowiedz
@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....
  • Odpowiedz