2009-08-12 14 views
8

Czy lepiej rzucić warunek iterator prawy operand z size_t do int lub iteracyjne potencjalnie przeszłość maksymalnej wartości int? Czy implementacja odpowiedzi jest specyficzna?Przesyłanie z size_t do int, lub iterować z size_t?

int a; 
for (size_t i = 0; i < vect.size(); i++) 
{ 
    if (some_func((int)i)) 
    { 
     a = (int)i; 
    } 
} 

int a; 
for (int i = 0; i < (int)vect.size(); i++) 
{ 
    if (some_func(i)) 
    { 
     a = i; 
    } 
} 
+1

biorę go na myśli size_t wszędzie Twoje pytanie mówi type_t? Jeśli tak, edytuj go. –

+2

Użyj 'static_cast'. – GManNickG

+4

Należy zauważyć, że 'size_t' i' int' nie są tego samego typu, nawet w systemie 32-bitowym. 'size_t' jest unsigned, a' int' jest podpisane. To może być znaczący przedmiot. –

Odpowiedz

7

I prawie zawsze używać pierwszą odmianę, ponieważ uważam, że około 80% czasu, odkrywam, że some_func prawdopodobnie powinien również wziąć a size_t.

Jeśli w rzeczywistości some_func ma podpisane int, musisz mieć świadomość tego, co dzieje się, gdy vect jest większy niż INT_MAX. Jeżeli rozwiązanie nie jest oczywiste w sytuacji (zazwyczaj nie jest), można zastąpić przynajmniej some_func((int)i) z some_func(numeric_cast<int>(i)) (patrz Boost.org dla jednej realizacji numeric_cast). Ma to tę zaletę, że rzuca wyjątek, gdy vect powiększa się, niż planowałeś, zamiast milcząco zawijać do wartości ujemnych.

+0

Lubię idea wyjątek wyrzucane w tym przypadku, ponieważ eliminuje naprawdę dziwne zachowanie ... Potem znowu, że to będzie ogromna ilość kłopotów, biorąc pod uwagę, że prawdopodobnie nigdy nie pójdzie na 'INT_MAX'. –

+0

@Nick: Dlaczego sądzisz, że dodanie obejmują i używając innej obsady (i właściwą jeden, FTM - odlewy C-style nie są właściwe) jest zbyt wiele kłopotów. – sbi

+0

Funkcja powinna "robić, co chcesz". Funkcja, która "robi, co chcesz, aż jakiś nieudokumentowany limit zostanie przekroczony, a następnie robi coś innego", jest powszechnie nazywana "miną lądową". Pozostawienie min przeciwpiechotnych w twoim kodzie jest zawsze złym pomysłem na cokolwiek innego niż problem z pracą domową. –

3

bym po prostu zostawić go jako size_t, ponieważ nie jest to dobry powód, aby tego nie robić. Co masz na myśli przez "lub iterować potencjalnie do maksymalnej wartości type_t"? Wykonujesz iterację tylko do wartości vect.size().

1

Dla większości kompilatorów, że nie będzie żadnej różnicy. W systemach 32-bitowych jest to oczywiste, ale nawet w 64-bitowych systemach obie zmienne będą prawdopodobnie przechowywane w rejestrze 64-bitowym i przesyłane na stosie jako wartość 64-bitowa.

Jeśli kompilator przechowuje wartości int jako wartości 32-bitowe na stosie, pierwsza funkcja powinna być bardziej wydajna pod względem cykli procesora.

Ale różnica jest znikoma (choć z drugiej funkcji „wygląda” czystsze)

+0

Dzięki, tak, myślałem, że drugi wygląda czystszy, ponieważ jest mniej rzucania. Zgoda? –

Powiązane problemy