Como um programador, o que eu preciso para se preocupar quando se mudar para o Windows de 64 bits?
-
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.
Solução
artigos:
20 questões de portar o código C ++ na plataforma 64-bit
Os problemas esquecidos do desenvolvimento de programas de 64 bits
64 bits, Wp64, Visual Studio 2008, Viva64 e todo o resto .. .
armadilhas de detecção durante a migração de código C e C ++ para 64-bit Windows
E
ferramenta Viva64 - para programas de 64 bits de verificação:
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 chamarVirtualAlloc
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 você EXEs 32 bits que foram construídas com o
/LARGEADDRESSAWARE
opção MSVC vinculador (ou que tenham a flagIMAGE_FILE_LARGE_ADDRESS_AWARE
em seus cabeçalhos PE através de outros meios, tais comoeditbin.exe
), então eles obter um completo 4 GB de espaço de endereço virtual no Windows de 64 bits, e você deve testá-los com o conjuntoAllocationPreference
valor de registo. - Se você tiver DLLs de 32 bits que podem ser carregados pelo grande endereço EXEs conscientes existente, você deve testá-los com o conjunto
AllocationPreference
valor de registo. - Se você recompilar seu código de C / C ++ em um 64-bit EXE ou DLL, você deve testá-lo com o conjunto
AllocationPreference
valor de registo.
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 :
- Isto fará com que o compilador avisos Emit para typecasts que ponteiros truncar ou estender tipos integrais menores em ponteiros (mesmo quando
reinterpret_cast
ou um elenco de estilo C é usado), bem como algumas outras questões de portabilidade de 64 bits. - Sim, a documentação diz que em vez de compilação com
/Wp64
você deve usar um compilador que as metas de uma plataforma de 64 bits, mas que por si só não vai pegar ponteiro truncamento / questões de extensão em tempo de compilação. Usando um compilador que as metas de 64 bits e permitindo a opção de compilador/Wp64
para a construção de 64 bits vai pegar muitos problemas ponteiro truncamento / extensão em tempo de compilação, e isso vai lhe poupar tempo, a longo prazo. - Infelizmente, com MSVC 2008, este irá também produzir um "aviso de linha de comando" para cada unidade de tradução dizendo que a opção
/Wp64
está obsoleta. Eu posso ver por que a opção está obsoleta para 32-bit constrói (onde é um corte mal que requer anotar muitos de seus typedefs), mas é uma pena que ele também está obsoleta para 64-bit constrói (onde é realmente útil).
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 \