Qual é a diferença entre WORD_BIT
e LONG_BIT
? E qual devo usar para descobrir o tamanho das palavras do meu sistema? Ambos retornam resultados diferentes
➜ ~ getconf LONG_BIT
64
➜ ~ getconf WORD_BIT
32
➜ ~
Também li em outro post que uma maneira confiável de descobrir o tamanho da palavra é imprimir o tamanho do vazio. Isso me dá 8 bytes.
printf("%d\n", (int)sizeof(void*));
Será sempre igual ao resultado retornado por getconf LONG_BIT
?
Desculpe, fazendo mais uma pergunta aqui - o tamanho da palavra está relacionado à arquitetura da CPU. O sistema operacional também funcionará no mesmo tamanho de palavra definido pela arquitetura da CPU?
POSIX define
WORD_BIT
eLONG_BIT
como o número de bits em objetos dos tiposint
elong
respectivamente. O tamanho de um objeto do tipovoid *
é o tamanho de um ponteiro para dados¹.32 bits
int
e 64 bitslong
e ponteiros são o modelo padrão para Linux em x86 de 64 bits; é conhecido como LP64 (consulte as extensões AMD64 para o System V ABI).Não há ligação garantida entre esses tamanhos; a única garantia de igualdade de tamanho que C fornece é
sizeof(char)
1. O Windows em x64, por exemplo, usa ponteiros de 32 bitslong
eint
64 bits. (Existem outros requisitos de tamanho: C garante quesizeof(short)
≤sizeof(int)
≤sizeof(long)
e tenham pelo menos 16 bits e pelo menos 32 bits; o POSIX também exige issoshort
e tenham pelo menos 32 bits de comprimento.)int
long
int
long
O tamanho do objeto mais significativo em termos de correspondência entre um sistema operacional e uma CPU é o tamanho do ponteiro (como
int
elong
são tratados é principalmente uma preocupação do compilador), mas a relação entre o sistema operacional e o tamanho do ponteiro da CPU nem sempre é direta. . Um sistema operacional deve usar um tamanho de ponteiro suportado pela CPU, mas as CPUs podem suportar vários tamanhos de ponteiro... Por exemplo, CPUs x86 de 64 bits² podem executar sistemas operacionais de 64 bits (Windows x64, Linux de 64 bits, etc. ), sistemas operacionais de 32 bits (Windows x32, Linux de 32 bits, OS/2, etc.) e sistemas operacionais de 16 bits (como MS-DOS). Mesmo entre sistemas operacionais de 64 bits, pode haver variações, conforme mencionado acima (32 bitslong
no Windows x64, 64 bitslong
no Linux de 64 bits), e até mesmo o tamanho do ponteiro “nativo” pode não ser o esperado (o Linux x32 ABI e o SPARC usam ponteiros de 32 bits no espaço do usuário). Historicamente, as versões lançadas do Windows na plataforma Alpha de 64 bits eram sistemas operacionais de 32 bits.¹ Em alguns ambientes (não Unix, até onde sei), os ponteiros para dados nem sempre são do mesmo tamanho que os ponteiros para funções.
² Com suporte de firmware apropriado, até que a Intel lance CPUs X86S .
Para acrescentar outras informações: a frase “do tamanho de um ponteiro” é ambígua. Nos modelos de memória x86 “Médio” e “Compacto”, o tamanho de um ponteiro para dados e o tamanho de um ponteiro para código não são iguais. O tipo
void *
refere-se a um ponteiro para dados.