AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79339585
Accepted
Thomas Weller
Thomas Weller
Asked: 2025-01-08 22:39:02 +0800 CST2025-01-08 22:39:02 +0800 CST 2025-01-08 22:39:02 +0800 CST

O "armazenamento automático" agora inclui registradores?

  • 772

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

c++
  • 2 2 respostas
  • 127 Views

2 respostas

  • Voted
  1. Best Answer
    Useless
    2025-01-08T23:23:25+08:002025-01-08T23:23:25+08:00

    o armazenamento de registro foi descontinuado por um longo tempo ... No entanto, o compilador ainda pode colocar variáveis ​​em um registro

    A registerpalavra-chave nunca foi necessária ou particularmente útil, em nenhuma implementação de C++ com a qual trabalhei. No máximo, era uma dica como inlinewas antes de ganhar semântica real.

    O "armazenamento automático" agora inclui registradores?

    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.

    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?

    É 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 constexprvalores, 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:

    1. se eles se encaixam
    2. se o otimizador realmente encontra registros não utilizados suficientes
    3. se o endereço deles já foi usado
    4. se eles são usados ​​ou passados ​​por referência

    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.

    • 6
  2. HolyBlackCat
    2025-01-08T23:33:36+08:002025-01-08T23:33:36+08:00

    O padrão C++ não descreve registradores. O compilador pode colocar o que quiser neles, mas deve fazê-lo de forma transparente.

    Eu só quero usar o termo correto quando falo com meus colegas

    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.

    Esclareci especificando Windows com MSVC.

    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.

    • 2

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve