Pergunta sobre caching, performance, c++, latency – A palavra-chave de registro ainda é usada?

11

Acabei de encontrar a palavra-chave register em C ++ e me perguntei como isso parece uma boa idéia (mantendo certas variáveis ​​em um registrador) certamente o compilador faz isso por padrão?

Então eu me perguntei se esta palavra-chave ainda é usada?

editado para refletir acima user997112
@ user997112: Melhor explicação de 'inline' se você vai me dizer:stackoverflow.com/questions/1759300/… Martin York
Masinline não é apenas uma dica. Fanael
@ user997112: Isso é retirado do contexto.inline faz tem outras implicações reais. Kerrek SB

Sua resposta

6   a resposta
13

register palavra-chave (a menos que imponha um erro sintático ou semântico).

O padrão também não diz que qualquer coisa deve ser mantida em um registro; apenas que é uma dica para a implementação que a variável será usada com muita frequência. Seu uso é até mesmo obsoleto.

7.1.1 Especificadores de classe de armazenamento [dcl.stc]

3) Um especificador de registro é uma dica para a implementação de que a variável assim declarada será fortemente usada. [Nota: A dica pode ser ignorada e na maioria das implementações ela será ignorada se o endereço da variável for obtido. Este uso é obsoleto (veja D.2). - nota final

Existe realmente um compilador existente que respeitaregister? Axel Gneiting
@ AxelGneiting GCC faz (em C). user703016
As versões atuais do clang avisam se você usa o registrador em C ++ 11. leecbaker
Você tem uma fonte para essa afirmação? Eu ficaria muito surpreso com isso. Axel Gneiting
5

programa C ++.

Além disso, é apenas uma sugestão para o compilador principalmente compiladores podem fazer isso otimização por isso não há realmente muito uso de usarregister palavra-chave e mais, porque os compiladores podem ou não seguir a sugestão.

Então a única coisaregister palavra-chave faz com compiladores modernos é impedir que você use& para pegar o endereço da variável.

Usando oregister palavra-chave apenas impede que você tome o endereço da variável em C, enquanto em C ++, tendo o endereço da variável apenas faz o compilador ignorar oregister palavra chave.

Bottomline é,Apenas não use!

Bem explicado por Herb:
Palavras-chave que não são (ou, comentários por outro nome)

@Cicada: sim, e essa questão é sobre C ++. Fanael
@Cicada: Hmm..eu vejo..estava apenas citando Herb, parece que ele escorregou aqui. Alok Save
É legal levar o endereço deregister variável, não impede nada. Fanael
Você disse"é tão significativo quanto espaço em branco". user703016
7

O especificador de registro deve ser aplicado somente aos nomes das variáveis ​​declaradas em um bloco (6.3) ou aos parâmetros de função (8.4). Ele especifica que a variável nomeada tem duração de armazenamento automático (3.7.3). Uma variável declarada sem um especificador de classe de armazenamento no escopo de bloco ou declarada como um parâmetro de função tem duração de armazenamento automático por padrão.

Um especificador de registro é uma sugestão para a implementação de que a variável assim declarada será fortemente usada. [Nota: A dica pode ser ignorada e na maioria das implementações ela será ignorada se o endereço da variável for obtido. Este uso é obsoleto (veja D.2). - nota final

Em suma:register é inútil, vestigial, atavistic e depreciado. Seu principal objetivo é dificultar a vida das pessoas que estão tentando implementar classes de auto-registro e querem nomear a função principalregister(T *).

5

o único uso remotamente sério para oregister palavra-chave esquerda é umExtensão GCC que permite usar um registro de hardware embutido em código sem montagem em linha:

register int* foo asm("a5");

Isso significa que qualquer acesso afoo afetará o registro da CPUa5.

Esta extensão do curso tem pouco uso fora do código de nível muito baixo.

3

não é usado. É apenas uma dica e muito fraca. Compiladores têm alocadores de registros, eles podem descobrir quais variáveis ​​devem ser mantidas em registros (e explicar coisas que você provavelmente nunca pensou).

Na verdade,é usado, é só olhar porque o Termux não tem o openjdk: o clang não suporta mais e o OpenJDK mobile / jdk9 o usa. Kaeptm Blaubaer
0

register" foi descontinuada desde o padrão C ++ de 2011; Vejo"Remover uso obsoleto da palavra-chave registrada". Por isso, não deve ser usado.

Em minhas próprias experiências, descobri que o código de depuração gerado pelo gcc (v8.1.1) difere se a palavra-chave "register" é usada; o código de assembly gerado aloca variáveis ​​designadas para registradores. Os benchmarks mostraram até que esse código rodou mais rápido (que o código sem "registrar"). Isso é irrelevante, no entanto, como o código release (otimizado) não mostrou diferenças (isto é, o uso de "register" não teve efeito). Estados VacbobAqui que, se alguma otimização estiver ativada, o gcc ignorará "register". Meus próprios testes confirmam isso.

Portanto, em resumo, não use "register" e, se o código de depuração aparecer mais rápido quando o "register" for usado, tenha em mente que o código de release otimizado não será.

Perguntas relacionadas