Pontos a serem considerados ao escrever código que seja portável para arquiteturas de 32 e 64 bits

StackOverflow https://stackoverflow.com/questions/2254222

  •  20-09-2019
  •  | 
  •  

Pergunta

Quais são os pontos que devem ser mantidos em mente ao escrever código que deve ser portátil em máquinas de 32 e 64 bits?

Pensando mais nisso, acho que se você puder agregar sua experiência em termos dos problemas enfrentados, isso ajudaria.

Acrescentando mais sobre isso, uma vez enfrentei um problema devido à falta de um protótipo de uma função que estava retornando um ponteiro.Quando portei o mesmo para uma máquina de 64 bits, o código estava travando e eu não tinha ideia do motivo por algum tempo, mais tarde percebi que todos os protótipos ausentes deveriam retornar int causando o problema.

Qualquer exemplo desse tipo pode ajudar.

EDITAR:Adicionando ao wiki da comunidade.

Foi útil?

Solução

Pegadinhas:

  1. Lançar ponteiros para tipos inteiros é perigoso
  2. Os tamanhos da estrutura de dados podem mudar
  3. Cuidado com a extensão do sinal
  4. ABI diferente?

Algumas dicas e truques que considero úteis:

  1. Obtenha um tipo inteiro de tamanho nativo (de um cabeçalho ou typedef seu próprio) e use-o quando tiver variáveis ​​que não se importam com o tamanho.
  2. Use tipos de variáveis ​​explícitas sempre que possível (u_int64_t, int_32_t, etc.)

Outras dicas

  • Alguns tipos integrais podem ter tamanhos diferentes
  • Ponteiros são de diferentes comprimentos
  • Estrutura preenchida
  • Alinhamento

No Windows, há apenas uma convenção de chamadas no X64, em oposição ao múltiplo em uma máquina X32 regular.

As coisas ficam mais obscuras quando você tem alguns componentes de 32 bits e cerca de 64 bits. No Windows, acabei escrevendo um serviço COM para fazê -los conversar.

Empurrar as dicas para a pilha ocupa o dobro do espaço. O tamanho da pilha pode não mudar entre as versões do SO, causando código que funciona bem em 32 bits para falhar misteriosamente quando compilado e executar inalterado em 64 bits. Não me pergunte como eu sei disso.

sizeof (int) pode! = sizeof (void*)

alinhamento. É possível que os alinhamentos precisem mudar. Isso pode expor bugs onde você tem maltratado as coisas que deveriam ter sido alinhadas, mas só foram alinhadas por acidente em 32 bits (ou em um processador que não se importa)

Não passe 0 em varargs se o receptor estiver esperando um ponteiro. Isso é doloroso em C ++, onde os desenvolvedores mais experientes sabem que 0 é um ponteiro nulo válido. CA dev geralmente usa nulo, então você provavelmente está bem

Escreva testes automatizados e execute -os regularmente nas duas plataformas.

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