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_tde consistência.
Observe que você sempre deve usar size_tse 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_tpara ser unsigned int, e também é válido para que possa ser typedefed para unsigned long. Se você usar intou longdiretamente, 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_te 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 intou se longafastar 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.