Essa resposta realmente depende de quem usará seu código e de quais padrões eles desejam ver.
size_t
é um tamanho inteiro com uma finalidade:
O tipo size_t
é um tipo de número inteiro não assinado definido pela implementação que é grande o suficiente para conter o tamanho em bytes de qualquer objeto. (Especificação C ++ 11 18.2.6)
Portanto, sempre que desejar trabalhar com o tamanho de objetos em bytes, você deve usar size_t
. Agora, em muitos casos, você não está usando essas dimensões / índices para contar bytes, mas a maioria dos desenvolvedores prefere usá-los para fins size_t
de consistência.
Observe que você sempre deve usar size_t
se sua classe tem a aparência de uma classe STL. Todas as classes STL na especificação são usadas size_t
. É válido para o compilador para typedef size_t
para ser unsigned int
, e também é válido para que possa ser typedefed para unsigned long
. Se você usar int
ou long
diretamente, você encontrará os compiladores onde uma pessoa que acha que sua classe seguiu o estilo da STL fica presa porque você não seguiu o padrão.
Quanto ao uso de tipos assinados, há algumas vantagens:
- Nomes mais curtos - é realmente fácil para as pessoas digitarem
int
, mas é muito mais difícil confundir o código unsigned int
.
- Um número inteiro para cada tamanho - Há apenas um número inteiro compatível com CLS de 32 bits, que é Int32. Em C ++, há dois (
int32_t
e uint32_t
). Isso pode simplificar a interoperabilidade da API
A grande desvantagem dos tipos assinados é a óbvia: você perde metade do seu domínio. Um número assinado não pode contar tão alto quanto um número não assinado. Quando o C / C ++ apareceu, isso foi muito importante. Era necessário ser capaz de abordar todos os recursos do processador e, para isso, era necessário usar números não assinados.
Para os tipos de aplicativos direcionados ao .NET, não havia uma necessidade tão forte de um índice não assinado de domínio completo. Muitos dos propósitos para esses números são simplesmente inválidos em um idioma gerenciado (o pool de memória vem à mente). Além disso, quando o .NET foi lançado, os computadores de 64 bits eram claramente o futuro. Estamos muito longe de precisar de todo o intervalo de um número inteiro de 64 bits, portanto, sacrificar um bit não é tão doloroso quanto antes. Se você realmente precisa de 4 bilhões de índices, basta mudar para o uso de números inteiros de 64 bits. Na pior das hipóteses, você o executa em uma máquina de 32 bits e é um pouco lento.
Eu vejo o comércio como uma conveniência. Se você possui poder computacional suficiente para não se importar em desperdiçar um pouco do seu tipo de índice que nunca usará, é conveniente apenas digitar int
ou se long
afastar dele. Se você realmente quisesse esse último pedaço, provavelmente deveria ter prestado atenção à assinatura dos seus números.
-1
é retornado de funções que retornam um índice, para indicar "não encontrado" ou "fora do intervalo". Também é retornado deCompare()
funções (implementandoIComparable
). Um int de 32 bits é considerado o tipo digitar para um número geral, pelo que espero que sejam razões óbvias.