Pergunta
Eu tenho uma coisa como esta
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
o que ele faz, não importa.O código é executado rapidamente, do jeito que está agora, mais lento se a palavra-chave registo é removido.No entanto, quando eu adicionar no registo antes de int n, na verdade, é executado mais lentamente do que agora, mas mais rápido do que se não registra é usado.
Alguém pode explicar isso para mim?Obrigado.
Solução
register
dá o compilador uma dica para colocar a variável em um registrador, em vez de memória/espaço de pilha.Em alguns casos, não será suficiente se registra para cada variável você colocar esta palavra-chave no modo de colocá-lo em muitas variáveis podem forçar os outros fora de registros novamente.
Esta é apenas uma sugestão, porém, e o compilador não tem que levá-lo.
Outras dicas
Como você o tempo presente?Na prática, register
geralmente não faz nada.É um pedaço de sujeira, a partir de quando o compilador tecnologia foi extremamente primitivos e compiladores não conseguia descobrir de alocação de registro de si.Era suposto ser uma dica para atribuir um registo para essa variável e foi útil para variáveis usadas muito frequentemente.Hoje em dia, a maioria dos compiladores de simplesmente ignorá-lo e atribuir registros de acordo com seus próprios algoritmos.
No GCC, o registro definitivamente não é ignorado, a menos que você especifique as opções de otimização. Testando seu código com algo assim
unsigned int array[10];
int n;
#define REG register
int main()
{
REG unsigned int a, b, c;
for (n = 0; n < 10; ++n){
c = a + b;
b = a;
a = c;
array[n] = c;
}
}
você obtém (dependendo se o reg é definido ou vazio)
http://picasaweb.google.com/lh/photo/v2hbpl6d-soidbxuomaemw?feat=directLink
À esquerda, é mostrado o resultado do uso de registros.
Há um número limitado de registradores disponíveis, de modo a marcação de tudo como registrar não colocar tudo nos registos.O Benchmarking é a única maneira de saber se isso vai ajudar ou não.Um bom compilador deve ser capaz de descobrir quais variáveis para colocar em registos sobre a sua própria, então você provavelmente deve referência mais alguns antes de decidir que o registro de palavras-chave ajuda.
A idéia de usar o register é, a variável é usada extremamente muitas vezes.Se não houver qualquer operação com a variável, ela será copiada para um registo de qualquer maneira.Para contador (índice de variáveis) são candidatos a este modificador.No exemplo de Diego Torres Milano a partir de Jan 15 '10 em 1:57 eu iria fazê-lo desta forma:
unsigned int array[10];
int main()
{
register int n;
unsigned int a = 1, b = 2, c;
for (n = 0; n < 10; ++n){
c = a + b;
b = a;
a = c;
array[n] = c;
}
}
Há um limite para o allocatable registradores.Se você outgo-lo, você acabou de terminar com menos eficiente do código.
A minha opinião é que se o que você faz é tão importante que você tem que decidir por si mesmo o que se passa em um registrador e o que não funciona, você deve escrevê-lo usando a linguagem assembly.
Para propósito geral, línguas, eu acredito fortemente que um compilador é mais capaz de decidir o que se passa em um registro do que um humano.A prova sendo que enquanto você não tiver certeza de como muitas variáveis que você pode colocar em registros, o compilador sabe com certeza.