Pergunta

Estou lendo a K & R e chegou à pequena seção sobre variáveis ??de registro, e queria saber se as pessoas aqui têm alguns bons exemplos disso colocar em prática.

De secção 4.7 na K & R:

Os olhares declaração registo como
register int x;
register char c;

Para ser claro, eu só estou esperando para ver alguns exemplos de código legal. I (tenho quase certeza que eu) entender o assunto assim que não sente a necessidade de digitar uma detalhada explicação (a menos que você quiser).

Foi útil?

Solução

Não há bom exemplo do uso de registo ao usar compiladores modernos (leia-se: últimos 15 + anos), porque ele quase nunca faz qualquer bom e pode fazer algum mal. Quando você usa registrar, você está dizendo ao compilador "Eu sei como otimizar meu código melhor do que você", que quase nunca é o caso. Uma das três coisas podem acontecer quando você usa registrar:

  • O compilador ignora-lo, este é o mais provável. Neste caso, o único mal é que você não pode tomar o endereço da variável no código.
  • As honras compilador o seu pedido e como resultado o código é executado mais lento.
  • O honras compilador o seu pedido e o código é executado mais rapidamente, este é o cenário menos provável.

Mesmo se um compilador produz um código melhor quando você usa registar, não há razão para acreditar que outro fará o mesmo. Se você tem algum código crítico que o compilador não é otimizar bem o suficiente a sua melhor aposta é provavelmente usar assembler para aquela parte de qualquer maneira, mas é claro fazer o profiling apropriada para verificar o código gerado é realmente um problema em primeiro lugar.

Outras dicas

Em geral eu concordo com o , mas como qualquer boa regra este tem exceções também.
Se você trabalhar em sistema profundamente enraizado que você pode saber melhor do compilador como otimizar o código para sua aplicação específica em sua arquitetura de hardware específica .

Mas em 99% dos casos Roberts explicação boa para a palavra incorporado também.

Eu sei que isto é de algum tempo, mas aqui é uma implementação de um subprocedimento de heapsort em que o uso de variáveis ??de registro torna o algoritmo mais rápido, pelo menos usando gcc 4.5.2 para compilar o código

inline  void max_heapify(int *H, int i){
    char OK = FALSE;
    register int l, r, max, hI;
    while(!OK){
        OK = TRUE;
        l = left(i);
        r = right(i);
        max = i;
        if(l <= H[SIZE] && H[l] > H[i]){
            max = l;
        }
        if(r <= H[SIZE] && H[r] > H[max]){
            max = r;
        }
        if(max != i){
            OK = FALSE;
            hI = H[i];
            H[i] = H[max];
            H[max] = hI;
            i = max;
        }
    }
}

Eu testei o algortihm com e sem a palavra-chave registo antes dos atributos e executou-lo para classificar uma matriz aleatória com 50.000.000 elementos no meu notebook, algumas vezes para cada versão.

a utilização de registos caiu o tempo heapsort de ~ 135s para ~ 125s.

Eu também testado apenas com 5.000.000 elementos, mas executa-lo mais vezes.

A versão sem o registo começou no 11s, mas cada execução baixou o tempo até chegar a 9,65s e parou para ele

a versão com o registo começou no 10s e baixou o tempo até 8,80s.

Eu acho que tem algo a ver com a memória cache. No entanto, parece que os registros fazer o algoritmo mais rápido por um fator constanct

Uma vez que essas variáveis ??são muito muito utilizado ao longo do algoritmo, garantindo que eles estão no registo em vez de deixar este trabalho para o compilador levou a um melhor resultado neste caso. No entanto, não melhorou o tempo muito.

Esperamos thill será útil para alguém, saudações.

Outro caso comum é quando a implementação intérpretes de baixo nível. Manter algum estado nos registos, por exemplo. ponteiro da pilha da máquina virtual, pode reduzir o acesso à memória significativamente e velocidade acima de você código.

vmgen - um gerador de eficientes intérpretes de máquinas virtuais para um exemplo do optimization (5.2 Top de caching pilha).

primeira é, variáveis ??registo deve ser usado para as variáveis ??muito utilizadas como variável de controle de loop para melhorar o desempenho, minimizando o tempo de acesso. secundária que você pode usar apenas e só registar especificador de armazenamento nesta situação como, divertido (auto int a, auto int b): Erro fun (registar int a, cadastre-se int b): direito só isso seria run fun (static int um, static int b): Erro fun (extern int a, extern int b): Erro

Bem esta é uma questão que precisa de respostas múltiplas, porque há vários contexes codificação:. A partir da perspectiva linguagem de alto nível, o nível médio e baixo nível (baixo para montagem) desde a linguagem C pode chamar montagem rotinas

A razão para usar a montagem em vez de C é exavtly por causa de problemas de desempenho encontrados durante o desenvolvimento soz sim, há uma necessidade para a palavra-chave registo, mas não ele não está funcionando como pretendido pelo desenvolvedor em muitos casos

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