Pergunta

Possível duplicata:
Existem plataformas em que ponteiros para diferentes tipos têm tamanhos diferentes?

Eu li em vários lugares que os ponteiros de diferentes tipos podem ter representações diferentes nas implementações C de conformidade padrão. Isso é uma coisa que torna necessário lançar argumentos de ponteiro para printf, por exemplo

int foo;
printf("address is %p\n", (void *) &foo);

Eu estava cético em relação a isso e cutuquei o padrão C99 (documento WG14 N1256, disponível em http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf). Às 6.2.5.27, ele diz:

Um ponteiro para anular deve ter os mesmos requisitos de representação e alinhamento que um ponteiro para um tipo de caractere. Da mesma forma, as dicas para versões qualificadas ou não qualificadas de tipos compatíveis devem ter os mesmos requisitos de representação e alinhamento. Todas as indicações para os tipos de estrutura devem ter os mesmos requisitos de representação e alinhamento que o outro. Todas as dicas para os tipos de sindicatos devem ter os mesmos requisitos de representação e alinhamento que o outro. Ponteiros para outros tipos não precisam ter os mesmos requisitos de representação ou alinhamento.

Portanto, realmente parece uma implementação C99 em conformidade pode usar representações diferentes para ponteiros de diferentes tipos.

Minha pergunta é a seguinte: Quais são as implementações/arquiteturas C que realmente usam representações diferentes para ponteiros de diferentes tipos?

Foi útil?

Solução

Cray Classic (não sei sobre seus novos produtos) não conseguiu abordar os personagens com indicadores regulares, então char* e portanto void* eram diferentes dos ponteiros vetoriais nativos.

(Veja o comentário de Keith abaixo, no entanto. Pode ter havido diferentes ABIs em uso e, girando os bits de endereço de ordem baixa para a extremidade de alta ordem, eles às vezes fizeram os ponteiros "finos" e "grossos" compatíveis com um grau.)

Outras dicas

Provavelmente o mais conhecido são os processadores de modo real x86, que podem ter ponteiros de dados de 16 bits e ponteiros de função de 32 bits, dependendo do modelo de memória que você escolheu (ou você pode ter ponteiros de dados de 32 bits com ponteiros de função de 16 bits , ou algo mais uma vez diferente ...).

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