kısa cevap:
neredeyse hiç
uzun cevap:
32 bitlik bir sistemde 2GB'dan daha büyük bir char vektörüne ihtiyacınız olduğunda. Diğer her kullanım durumunda, imzalı bir tür kullanmak, imzasız bir tür kullanmaktan çok daha güvenlidir.
misal:
std::vector<A> data;
[...]
// calculate the index that should be used;
size_t i = calc_index(param1, param2);
// doing calculations close to the underflow of an integer is already dangerous
// do some bounds checking
if( i - 1 < 0 ) {
// always false, because 0-1 on unsigned creates an underflow
return LEFT_BORDER;
} else if( i >= data.size() - 1 ) {
// if i already had an underflow, this becomes true
return RIGHT_BORDER;
}
// now you have a bug that is very hard to track, because you never
// get an exception or anything anymore, to detect that you actually
// return the false border case.
return calc_something(data[i-1], data[i], data[i+1]);
İmzalı eşdeğer size_t
olduğunu ptrdiff_t
, değil int
. Ancak int
kullanımı çoğu durumda size_t boyutundan daha iyidir. ptrdiff_t
olduğu long
32 ve 64 bit sistemlerde.
Bu, çok güzel olmayan bir std :: kaplarıyla her etkileşim kurduğunuzda, size_t boyutuna ve on'dan dönüştürmeniz gerektiği anlamına gelir. Ancak devam eden yerel bir konferansta c ++ yazarları işaretsiz bir size_t ile std :: vector tasarlamanın bir hata olduğunu belirtti.
Derleyiciniz size ptrdiff_t ile size_t arasındaki örtük dönüşümlerle ilgili uyarılar verirse, bunu yapıcı sözdizimi ile açık hale getirebilirsiniz:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
sadece bir koleksiyonu yinelemek istiyorsanız, sınırlama olmadan, aşağıdakileri temel alan aralığı kullanın:
for(const auto& d : data) {
[...]
}
burada yerli gitmek Bjarne Stroustrup (C ++ yazar) bazı kelimeler
Bazı insanlar için, STL'deki bu imzalı / imzasız tasarım hatası, std :: vector'u kullanmak yerine kendi uygulamasını kullanmak için yeterlidir.
size_t
size yol açabilir gerekirken güvenlik hataları .