Pergunta

GCC 4.4.1, C99

estou usando size_t, e size_t é um unsigned int. No entanto, isso depende se você estiver executando 32 bits ou 64 bits.

Eu estarei usando size_t Para armazenar o tamanho de um buffer.

Portanto, não acho que isso seja muito portátil se usar as arquiteturas.

Apenas uma pergunta, com o uso size_t em 32 ou 64 bits. Que situações causariam o problema mais sério?

Foi útil?

Solução

size_t É garantido que seja capaz de manter o número de bytes de qualquer objeto em sua implementação. É por isso que o tipo de retorno de sizeof é size_t.

Então, sim, é portátil.

Outras dicas

Como outros disseram, size_t é correto e perfeitamente aceitável para armazenar o resultado de sizeof() ou o tamanho de qualquer objeto representável em bytes. O que você tem a observar é o seguinte:

  1. size_t tem o mesmo tamanho que algum tipo inteiro não assinado. Não é necessariamente o mesmo número de bytes que o maior tipo inteiro não assinado, unsigned int, unsigned long, etc.
  2. sizeof(size_t) é um número definido por implementação de bytes, então memcpy'ing, ou atribuir a qualquer tipo de número inteiro que não uintmax_t é uma má ideia. Nem tenho certeza de que é seguro assumir que é de tamanho igual ou menor do que uintmax_t.
  3. Escrevendo a size_t valor para um arquivo binário e lendo -o de volta em um size_t Por outro processo, em uma máquina diferente, ou por algo compilado com diferentes opções de compilador, pode ser perigoso para sua saúde.
  4. Enviando um size_t valor em uma rede e tentando recebê -lo usando um sizeof(size_t) O buffer do outro lado é bastante inseguro.

Todos esses são problemas padrão com qualquer outro tipo inteiro, exceto unsigned char. Então size_t é tão portátil quanto qualquer outro tipo inteiro.

Faz algum sentido usar size_t ou ssize_t para um buffer se você estiver usando o Malloc () ou read (). Para portabilidade, use size_max, ssize_max, sizeof (digite-in-your-buffer) e %zd ou %zu printf ().

Você também teve off_t e ptrdiff_t / ssize_t, que variam entre arquiteturas da mesma maneira.

Se você os usar corretamente, eles serão portáteis entre as arquiteturas. Em um sistema de 32 bits, todos terão 32 bits de largura, enquanto em um sistema de 64 bits, todos terão 64 bits de largura. É isso que você deseja-o tamanho de um buffer não pode ser maior que um tamanho_t de 32 bits em um sistema de 32 bits, mas pode ser muito maior em um sistema de 64 bits.

Você nunca deve usar ints, longos ou qualquer outra coisa. Além de qualquer outra coisa, o tamanho de um longo varia dependendo da plataforma (32 bits na maioria dos sistemas de 32 bits, 64 bits em sistemas UNIX de 64 bits, 32 bits no Windows de 64 bits).

É difícil descobrir o que você quer dizer com "portátil" neste caso. O termo "portátil" permite múltiplas interpretações sinificadamente diferentes.

Modelo size_t tem um propósito muito específico. Ele pode conter o tamanho de qualquer objeto na implementação fornecida. Ou seja, é um tipo que sempre pode receber o resultado de sizeof() operador. Modelo size_t Não tem outro objetivo e, dentro do aplicativo pretendido, é 100% portátil, portátil que qualquer coisa possa ser.

Que tipo de "portátil" você está perguntando é, mais uma vez, não claro.

Você não deve assumir que size_t é um int não assinado (Veja esta resposta), mas acho que tem o mesmo alcance em ambas as arquiteturas.

Depende do que você está usando size_t.

Se você o usar para determinar o tamanho de um buffer de memória, ele será seguro, pois o size_t é grande o suficiente para abordar toda a memória de qualquer computador. Portanto, se o buffer de memória for maior que isso, você terá um problema de qualquer maneira.

Por outro lado, se você o usar como um número inteiro genérico não assinado para contar o número de estrelas no universo, por exemplo, você pode ter um problema no sistema de 32 bits (não tenho certeza de sistemas de 64 bits).

O único problema sério sério com isso é tentar acessar uma matriz bastante grande ou um grande número para size_t.

Assim como apenas um "int" regular pode ser suficiente em um 64 bit, mas pode causar uma falha em um 32 bit, porque é muito grande para um INT em um sistema de 32 bits.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top