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.

Foi útil?

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)

diff 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.

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