Guia de Portabilidade
Uma boa prática de engenharia de software é munimizar problemas de portabilidade gratuitos no código. Técnicas para minimizar problemas de portabilidade potenciais são:- O tamanho de tipos inteiros e de ponto flutuante deveriam ser considerados mínimos. Algorítmos deveriam ser projetados para continuar trabalhando corretamente se o tamanho do tipo aumenta.
- Computações de ponto flutuante podem ser levadas à uma maior precisão que o tamanho da variável de ponto flutuante pode segurar. Algorítmos de ponto flutuante deveriam continuar trabalhando corretamente se a precisão aumenta arbitrariamente.
- Evitar depender da ordem dos efeitos colaterais em uma computação que pode ser reordenada pelo compilador. Por exemplo:
a + b + c
pode ser avaliado como (a + b) + c, a + (b + c), (a + c) + b, (c + b) + a, etc. Parênteses controlam a precedência dos operadores, não a ordem de avaliação.Em particular, parâmetros de função podem ser avaliados ou da esquerda para direita ou da diretia para esquerda, dependendo das convenções de chamada usadas.
Se os operandos de um operador associativo + ou * são valores de ponto flutuante, a expressãonão é reordenada.
- Evitar dependência da ordem de bytes; isto é, se a CPU é big-endian ou little-endian.
- Evitar dependência do tamanho de um ponteiro ou referência ser do mesmo tamanho de um tipo inteiro particular.
- Se dependências de tamanho são inevitáveis, coloque um assert
no código para verificá-lo:
assert(int.sizeof == (int*).sizeof);
Portabilidade de 32 para 64 bits
Processadores e sistemas operacionais de 64 bits estão vindo. Com isso em mente:- Tipos inteiros manterão o mesmo tamanho entre código de 32 e 64 bits.
- Ponteiros e referências aumentarão de tamanho de 4 bytes para 8 bytes indo de código de 32 para 64 bits.
- Use size_t como um apelido para um tipo inteiro com sinal que possa caber no espaço de endereçamento.
- Use ptrdiff_t como um apelido para um tipo inteiro com sinal que possa caber no espaço de endereçamento.
- As propriedades .length, .size, .sizeof, e .alignof serão do tipo size_t.
Código Específico de SO
Código específico de sistema é controlado isolando as diferenças em módulos separados. Em tempo de compilação, o módulo específico do sistema correto é importado.Diferenças menores podem ser controladas por constantes definidas em uma importação específica de sistema, e usando essa constante em uma instrução if.