Estou tão confuso size_t
. Pesquisei na internet e em todos os lugares mencionei que size_t
é um tipo sem sinal, então, pode representar apenas valores não negativos.
Minha primeira pergunta é: se ele é usado para representar apenas valores não negativos, por que não usamos em unsigned int
vez de size_t
?
Minha segunda pergunta é: size_t
e são unsigned int
intercambiáveis ou não? Se não, por quê?
E alguém pode me dar um bom exemplo size_t
e resumidamente de seu funcionamento?
typedef /*This part is implementation dependent */ size_t;
Respostas:
Porque
unsigned int
não é o único tipo inteiro sem sinal.size_t
poderia ser qualquer umunsigned char
,unsigned short
,unsigned int
,unsigned long
ouunsigned long long
, dependendo da implementação.Eles não são intercambiáveis, pelo motivo explicado acima
^^
.Eu não entendo muito bem o que você quer dizer com "seu breve trabalho". Funciona como qualquer outro tipo sem sinal (em particular, como o tipo para o qual é typedeffed). Você é encorajado a usar
size_t
quando estiver descrevendo o tamanho de um objeto. Em particular, osizeof
operador e várias funções de biblioteca padrão, comostrlen()
retornosize_t
.Bônus: aqui está um bom artigo sobre
size_t
(e optrdiff_t
tipo intimamente relacionado ). Ele raciocina muito bem por que você deve usá-lo.fonte
size_t
ser umunsigned char
? Isso está no padrão permitido? Quero dizer, com essa ideia, como se poderia esperar que alguém usassecalloc()
(e sua família),strlen()
etc.? Isso me parece um absurdo.size_t
é definido no padrão como um "tipo inteiro sem sinal", mas não exige que seja o mesmo que qualquer umunsigned {char, short, int, long, long long}
.Existem 5 tipos de inteiros sem sinal padrão em C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
com vários requisitos para seus tamanhos e intervalos (resumidamente, o intervalo de cada tipo é um subconjunto do intervalo do próximo tipo, mas alguns deles podem ter o mesmo intervalo).
size_t
é umtypedef
(ou seja, um alias) para algum tipo sem sinal (provavelmente um dos acima, mas possivelmente um tipo inteiro sem sinal estendido , embora isso seja improvável). É o tipo fornecido pelosizeof
operador.Em um sistema, pode fazer sentido usar
unsigned int
para representar tamanhos; em outro, pode fazer mais sentido usarunsigned long
ouunsigned long long
. (size_t
é improvável que sejaunsigned char
ouunsigned short
, mas isso é permitido).O objetivo de
size_t
é aliviar o programador de ter que se preocupar com qual dos tipos predefinidos é usado para representar os tamanhos.O código que assume que
sizeof
produz umunsigned int
não seria portátil. O código que assume que produz umsize_t
tem mais probabilidade de ser portátil.fonte
unsigned int
,unsigned long
, etc.) quesize_t
corresponde ao depende da máquina na qual o código é executado? ou seja, em uma arquitetura de máquina, ele corresponde,unsigned int
mas em outra arquitetura ele corresponderáunsigned long
, etc?size_t
, especialmente se, por exemplo,unsigned long
eunsigned long long
forem do mesmo tamanho.long
,long long
etc. depende do sistema: Se você der uma olhada,limits.h
verá pelo menos no Unices que o valor máximo para ints depende do tamanho da palavra do sistema.size_t
tem uma restrição específica.Citando de http://www.cplusplus.com/reference/cstring/size_t/ :
Não é intercambiável
unsigned int
porque o tamanho deint
é especificado pelo modelo de dados. Por exemplo, LLP64 usa um de 32 bitsint
e ILP64 usa um de 64 bitsint
.fonte
size_t é usado para armazenar tamanhos de objetos de dados e é garantido ser capaz de manter o tamanho de qualquer objeto de dados que a implementação de C específica pode criar. Este tipo de dados pode ser menor (em número de bits), maior ou exatamente igual a unsigned int.
fonte
Além das outras respostas, também documenta o código e diz às pessoas que você está falando sobre o tamanho dos objetos na memória
fonte
apple
é uma maçã , umsize_t
é um tamanho ...size_t type é um tipo de inteiro não assinado de base da linguagem C / C ++. É o tipo de resultado retornado pelo operador sizeof. O tamanho do tipo é escolhido de forma que possa armazenar o tamanho máximo de um array teoricamente possível de qualquer tipo. Em um sistema de 32 bits size_t levará 32 bits, em um de 64 bits 64 bits. Em outras palavras, uma variável do tipo size_t pode armazenar com segurança um ponteiro. A exceção são os ponteiros para funções de classe, mas este é um caso especial. Embora size_t possa armazenar um ponteiro, é melhor usar outro tipo inteiro sem sinal uintptr_t para esse propósito (seu nome reflete sua capacidade). Os tipos size_t e uintptr_t são sinônimos. O tipo size_t é geralmente usado para contadores de loop, indexação de array e aritmética de endereço. O valor máximo possível do tipo size_t é constante SIZE_MAX.
fonte
size_t
pode armazenar o tamanho de qualquer objeto único. Um ponteiro pode apontar para qualquer byte de qualquer objeto. Você pode ter um sistema com, por exemplo, um espaço de endereço de 64 bits que limita o tamanho de qualquer objeto a 2 ** 32-1 bytes. Não há garantia de quesize_t
euintptr_t
sejam do mesmo tipo.Em palavras simples, size_t é dependente da plataforma e também da implementação, ao passo que o unsigned int depende apenas da plataforma.
fonte