Como um programador, o que eu preciso para se preocupar quando se mudar para o Windows de 64 bits?

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

  •  23-08-2019
  •  | 
  •  

Pergunta

A maioria da minha recente programação tem sido em 32-bit Windows usando C / C ++ / C # / VB6. Ultimamente, meus clientes estão perguntando se o meu código será executado em 64 bits do Windows.

Eu estou querendo saber o legado características que eu poderia estar usando que vai quebrar no Windows de 64 bits? Quais são alguns dos problemas do mundo real Eu preciso pensar e se preocupar?

Obviamente, vou testar meu código no sistema operacional de 64 bits, mas eu gostaria de saber quais as questões comuns que procurar. I mais preocupado com os binários existentes, mas estou aberto a comentários sobre o que se preocupar quando recompilar (quando possível).

EDIT: Aqui está uma boa lista de bugs portabilidade de 64 bits.

Outras dicas

Tanto quanto eu estou em causa, a única coisa mais importante sobre portar código C / C ++ para Windows de 64 bits é testar seu aplicativo com alocações MEM_TOP_DOWN habilitada (valor de registro AllocationPreference) como descrito em 4-Gigabyte Sintonia :

Para forçar alocações para alocar endereços superiores antes de endereços mais baixos para fins de teste, especifique MEM_TOP_DOWN ao chamar VirtualAlloc ou definir o seguinte valor do Registro para 0x100000:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

Quando que isso importa?

Se seu aplicativo C / C ++ cai em uma dessas três categorias e você não faz teste com alocações MEM_TOP_DOWN, o teste é muito improvável que pegar todos os erros ponteiro truncamento / signedness em seu código.

A segunda coisa mais importante, se você usar MSVC e você recompilar o código C / C ++ de 64 bits, é usar a opção de compilador /Wp64 para o seu 64-bit construção :

Pode ser mais fácil migrar .NET código se você tem 100% "tipo seguro código gerenciado". Você pode simplesmente copiá-lo para a plataforma de 64 bits e executá-lo com sucesso sob o CLR 64-bit. Marque esta MSDN ligação sobre a migração de código gerenciado de 32 bits para 64 bit.

Btw, Hanselman Blogged sobre o assunto recentemente.

Se você está falando sobre programas de 32 bits, então você tem praticamente nada para se preocupar desde o Windows 64 irá executá-los sob emulação como de 32 bits. Quaisquer problemas com futuras versões do Windows (por exemplo Windows 7) são susceptíveis de ser incompatibilidades ao invés de problemas com um 64-bit OS.

No entanto, se o seu código gerenciado é compilado para o "Qualquer CPU" plataforma de destino e fazer chamadas em código não gerenciado (por exemplo PInvoke), ou são dependentes de outros conjuntos, em seguida, há algumas coisas a ter em conta. do pós sobre o x86 / x64 Scott Hanselman CLR cobre este e é uma boa explicação do CLR em Win32 / 64.

Ao desenvolver programas nativos de 64 bits, em seguida, o Programação guia para Windows de 64 bits é um guia bom. É em grande parte se resume a ponteiros e o tamanho dos tipos de dados:)

programas de 32 bits será executado muito bem em 64 bits do Windows. Contanto que você não está fazendo qualquer tipo de driver de dispositivo de desenvolvimento do curso.

Se você compilar o seu software como um software de 64 bits pela primeira vez, você precisa cuidar seguinte:

  • um ponteiro é de 64 bits de largura, enquanto um int é de 32 bits. Não guarde ponteiros em ints, seu código vai quebrar.
  • processo de necessidade 64 DLLs bit
  • 64 bits. Se depender de DLLs terceira parte, certifique-se que eles também são fornecidos em 64 bit. Se você precisa se comunicar entre um processo de 32 bits e um processo de 64 bits, você precisará de algumas das muitas maneiras diferentes de IPC no Windows. Chamando funções é diretamente fora de questão.
  • Os diretórios do sistema no Windows de 64 bits são diferentes do que em 32 bits do Windows. Se você tem alguns caminhos codificados duros, talvez seja necessário para vê-los novamente.

Se você fizer injeção de DLL por qualquer motivo, você terá problemas.

Do ponto de vista C / C ++ ....

Uma coisa óbvia é que o tamanho de um int se tornará 8 bytes em vez de 4 bytes. Se algum de seu código é dependente de que você pode obter resultados inesperados. Estrutura e alinhamentos variáveis ??podem deslocar. Você pode ser capaz de superá-lo com um pacote # pragma, mas eu não sou muito fluente em alinhamentos e embalagem.

Se você usar quaisquer sindicatos com ints neles, o comportamento pode mudar.

Se você estiver usando quaisquer estruturas bitfield, com base em ints o extra de 32 bits pode causar confusão. O bit de sinal não será onde você pensou que era.

Se você codificar quaisquer constantes hexadecimais e esperam sinais para ir negativo, você pode ter problemas. Exemplo 0x8000000 é um número negativo como um log, ou 32 bit inteiro. 0x80000000 como um número inteiro em uma plataforma 64 bits é um número positivo. para configurar diretamente o sinal mordeu você teria que usar 0x80000000 00000000 (espaço incorporado para facilitar a leitura apenas)

Também espero size__t para crescer adequadamente. Se você estiver fazendo quaisquer alocações baseadas em MAX_INT, eles vão ser muito maior.

Para evitar este tipo de anomalias de tamanho, eu geralmente fico com longs em vez de ints.

É a emulação de 32 bits realmente à prova de bala? Eu vi que o registro é Definiu um pouco diferente. Eu só estou querendo saber o que as coisas típicas não funcionam ...

Além disso, o C: \ windows \ System32 pode conter apenas DLLs de 64 bits. Se você tem uma DLL de 32 bits, você precisa colocá-lo em C: \ windows \ syswow64 \

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