MDK Temat założony przez niniejszego użytkownika |
size_t - czy dobrze rozumiem co ten typ robi? » 2016-11-08 01:59:09 W 27 rozdziale kursu pojawia się typ danych size_t. Wszędzie pisze, że jest to typ zwracany przez sizeof(). Ale co do tego, w jakich sytuacjach i po co go używać ciężko znaleźć jakieś łatwe do zrozumienia wyjaśnienia. I teraz, jeśli mamy np. size_t zmienna = 1; size_t zmienna2 = 25000
Jeśli dobrze rozumiem, size_t dobiera najlepszy typ zmiennej do sytuacji, tak? Czy to oznacza, że zamiast używać wszystkich typów unsigned, lepiej używać size_t? Dlaczego w tym przykładzie nie został użyty int lub unsigned int, tylko size_t? #include <string> #include <iostream>
void szukajZnaku( std::string & tekst, char szukanyZnak ) { size_t znalezionaPozycja = tekst.find( szukanyZnak ); if( znalezionaPozycja == std::string::npos ) std::cout << "Nie znaleziono znaku w tekscie" << std::endl; else std::cout << "Znak zostal odnaleziony na pozycji " << znalezionaPozycja << std::endl; }
int main() { std::string naszTekst = "Przyklad z kursu C++ (http://cpp0x.pl)"; szukajZnaku( naszTekst, 'k' ); return 0; }
|
|
carlosmay |
» 2016-11-08 08:52:45 std::size_tnamespace std { typedef unsigned int size_t; } |
|
MDK Temat założony przez niniejszego użytkownika |
» 2016-11-08 18:03:47 Czyli unsigned int i size_t to jedno i to samo? W jakich sytuacjach lepiej używać jednego, a w jakich drugiego?
edit:
Obejrzałem pewne wideo na youtube dotyczące size_t. https://www.youtube.com/watch?v=4afySnY-XgY
I tam ktoś dowodzi, że używanie w size_t typu unsigned jest błędem. To czy lepiej obejść się bez niego?
Może te pytania są rąbnięte ale kompletnie nie rozumiem size_t. |
|
carlosmay |
» 2016-11-08 22:19:23 I tam ktoś dowodzi, że używanie w size_t typu unsigned jest błędem. To czy lepiej obejść się bez niego? |
Nieostrożnie działanie na unsigned int lub std::size_t może przysporzyć kłopotów, ale nie obejdziesz się bez niego. Praktycznie cała biblioteka standardowa używa typu std::size_t do określania rozmiaru, pozycji w kolekcji, odległości między iteratorami itd. Kompilatory będą ostrzegać jeśli będziesz porównywać bądź próbować przypisać typ bez znaku do typu ze znakiem. |
|
michal11 |
» 2016-11-08 23:06:09 Najprościej mówiąc to size_t to inna nazwa na typ całkowity bez znaku czyli unsigned int tyle, nie ma tam żadnej magii. Możesz używać zamiennie size_t i unsigned int dla kompilatora to nie ma żadnej różnicy, jedynie będzie się taki kod słabo czytało. |
|
Elaine |
» 2016-11-08 23:12:40 namespace std { typedef unsigned int size_t; } |
Absolutnie nie. 18.2/6: The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object. |
To, jaki typ jest w stanie przechować rozmiar każdego obiektu w bajtach, z oczywistych powodów silnie zależy od implementacji. Nie zawsze jest to unsigned int: na systemie, z którego piszę ten post, unsigned int ma 32 bity, a obiekty mogą być znacznie większe niż 2^32 bajtów, dlatego size_t to 64-bitowy unsigned long. Na 64-bitowym Windowsie size_t to unsigned long long (bo unsigned long ma tam 32 bity). Wydaje mi się też, że widziałem platformy, gdzie size_t był aliasem na unsigned short. |
|
michal11 |
» 2016-11-08 23:16:44 @up
cenna uwaga ale obawiam się, że dla osoby która tego w ogóle nie rozumie, czyli dla autora tematu, może to tylko namieszać zamiast wyjaśniać. |
|
MDK Temat założony przez niniejszego użytkownika |
» 2016-11-08 23:23:58 Czyli, jeśli dobrze rozumię: 1. size_t jest typem danych, podobnie, jak bool, integer, czy long ( do tej pory myślałem, że przyjmuje on jakoś dynamicznie wielkość w zależności od wielkości zmiennej - przez to miałem największy mętlik w głowie). 2. Reprezentuje typ unsigned. 3. Ma stałą wielkość w ramach konkretnego systemu operacyjnego.
Czy dobrze myślę? |
|
« 1 » 2 |