Em duração do armazenamento , li que o armazenamento de registro foi descontinuado por um longo tempo (desde o C++98) e foi removido com o C++17.
Ainda assim, o compilador ainda pode colocar variáveis em um registrador. Eu assumo que ele fará isso como parte da duração de armazenamento automático :
Duração do armazenamento automático
As seguintes variáveis têm duração de armazenamento automática:
Variáveis que pertencem a um escopo de bloco e não são explicitamente declaradas como static, thread_local, (desde C++11) ou extern. O armazenamento para tais variáveis dura até que o bloco no qual elas são criadas saia. Variáveis que pertencem a um escopo de parâmetro (ou seja, parâmetros de função). O armazenamento para um parâmetro de função dura até imediatamente após sua destruição.
Para mim, parece que essa descrição é satisfeita para ambas, variáveis na pilha e variáveis em registradores, dado um aplicativo Windows Desktop e MSVC. Isso está correto?
Só quero usar o termo correto quando falo com meus colegas e estou explicitamente procurando por algo que possa significar "pilha ou registro".
A
register
palavra-chave nunca foi necessária ou particularmente útil, em nenhuma implementação de C++ com a qual trabalhei. No máximo, era uma dica comoinline
was antes de ganhar semântica real.Não, o armazenamento automático nos diz por quanto tempo algo vive, não onde ele vive. Desde que o tempo de vida esteja correto, o padrão não tem nada a dizer sobre registradores, ou pilhas, ou outros detalhes de implementação.
Alternativamente, o armazenamento automático sempre incluiu registradores, na medida em que o compilador sempre foi livre para colocar variáveis automáticas em registradores se a máquina abstrata permitisse. Nada mudou a esse respeito.
É mais preciso dizer que todas as variáveis automáticas satisfazem essa descrição por definição, independentemente de como são implementadas.
Variáveis automáticas que são otimizadas em um registro devem se comportar como se a variável existisse para todo o escopo, mesmo que o registro possa ser reutilizado se a alteração não for observável.
Variáveis automáticas alocadas (como um detalhe de implementação) em um quadro de pilha têm a garantia de satisfazer esta descrição somente se os quadros de pilha forem sempre emitidos, não houver inlining ou LTO, etc. Ou seja, embora o tempo de vida automático esteja, em algum sentido, relacionado às convenções de chamada do quadro de pilha, ele não é satisfeito automaticamente, mas por algum trabalho deliberado do compilador.
Variáveis automáticas também podem ser otimizadas fora do curso, e objetos não automáticos, como
static constexpr
valores, podem existir apenas em registradores (se é que se materializam).Finalmente, as corrotinas podem ter variáveis com escopo automático que não são armazenadas nem em um registrador nem em um quadro de pilha, mas em um objeto alocado pela promessa
operator new
.De qualquer forma, há outros fatores que afetam se as variáveis podem ser otimizadas em um registro, de forma não exaustiva:
Com exceção de parâmetros de função - em um compilador específico, usando uma ABI dada e sem inlining ou LTO - você nunca pode ter 100% de certeza se uma variável elegível para essa otimização está realmente em um registro em algum ponto. Exceto inspecionando o assembly, e isso ainda será frágil diante de atualizações do compilador, mudanças de opção do compilador e mudanças de código.
O padrão C++ não descreve registradores. O compilador pode colocar o que quiser neles, mas deve fazê-lo de forma transparente.
O termo correto está no cabeçalho da sua citação, "variáveis automáticas". Ou talvez "variáveis locais".
"Variáveis de pilha" também seriam frequentemente entendidas como incluindo todas as variáveis automáticas, tanto em registradores quanto na pilha real. Mas esse termo é propenso a críticas do tipo "C++ não tem pilha", já que o padrão também não o chama de pilha.
Honestamente, não vejo o que isso muda em relação à escolha de termos. Se você não discute código/assembly gerado específico, normalmente usa termos abstratos definidos no padrão, então não se preocupa com registradores.