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 / 79566041
Accepted
HolyBlackCat
HolyBlackCat
Asked: 2025-04-10 15:54:42 +0800 CST2025-04-10 15:54:42 +0800 CST 2025-04-10 15:54:42 +0800 CST

Variáveis ​​são formalmente um conceito de tempo de compilação?

  • 772

Observe que esta é uma pergunta de direito linguístico . Conheço o significado comum de "variável", mas estou tentando entender exatamente o que o padrão chama de "variáveis". Estou escrevendo um material didático e quero usar as definições corretas.


Variáveis ​​são comumente definidas como "objetos nomeados", ou mais corretamente "objetos que foram declarados" (já que variáveis ​​podem não ter nome, mas são sempre declaradas).

Mas há um segundo ponto de vista: variáveis ​​são um conceito de tempo de compilação. Segundo essa definição, uma declaração no código-fonte sempre corresponde a uma variável, mesmo que, em tempo de execução, vários objetos sejam criados a partir dela.

Qual está correta?


Aqui está um exemplo em que isso é importante. Digamos que você tenha

void foo(bool a)
{
    int x = 42;

    if (a)
        foo(false);
}

Quando você chama foo(true), duas instâncias de int x = 42;get existem ao mesmo tempo.

Eles são claramente dois objetos diferentes, mas tecnicamente são variáveis ​​diferentes ou a mesma variável?

Se variáveis ​​são uma coisa de tempo de compilação, então as duas são a mesma variável.


A segunda definição parece errada à primeira vista, mas aqui temos um membro do comitê C++ argumentando que ela é a correta , por exemplo.

c++
  • 2 2 respostas
  • 203 Views

2 respostas

  • Voted
  1. Best Answer
    Davis Herring
    2025-04-10T20:34:00+08:002025-04-10T20:34:00+08:00

    Com a ressalva de que minha opinião não é totalmente independente estatisticamente daquela citada, concordo plenamente: o uso de "variável" no padrão faz muito mais sentido interpretado como "o sujeito abstrato de declarações de certas formas" do que como "um espaço de memória considerado como tendo um certo tipo". O padrão frequentemente precisa discutir o nome de uma variável, o escopo dentro do qual ela é declarada, se duas declarações (talvez em unidades de tradução diferentes) declaram a mesma variável, se uma variável é uma referência ou não, e assim por diante, e essas coisas claramente pertencem à construção singular de tempo de tradução, e não a qualquer coisa que exista durante a execução. A evidência mais forte para este último ponto é que todas as regras sobre, digamos, uma variável ser utilizável em expressões constantes se aplicam mesmo se for uma variável local não estática em uma função que nunca é chamada.

    Por outro lado, a palavra "objeto" é usada principalmente de maneiras que correspondem ao conceito de "dados reais": ela tem um valor e um endereço e pode estar dentro ou fora do tempo de vida. Isso faz sentido porque o padrão deve suportar todas as operações de tempo de execução em objetos criados por new(posicionamento ou não), que obviamente não são variáveis.

    Infelizmente, o padrão não é totalmente consistente aqui, dependendo excessivamente da compreensão intuitiva do leitor sobre a intenção ao dizer coisas como "Uma variável é introduzida pela declaração [...] de um objeto" ([basic.pre]/7) e "variáveis ​​de bloco com duração de armazenamento automática [...] são inicializadas na ordem de declaração" ([stmt.dcl]/2). Algum progresso foi feito (o C++17 parou de chamar *thisuma "entidade" como se ela pudesse ser encontrada por meio de consulta de nome ou algo assim), e mais está por vir (o artigo do Reflection está fazendo uma limpeza adicional necessária para descrever o que ^^xsignifica).

    • 4
  2. Yakk - Adam Nevraumont
    2025-04-10T22:31:58+08:002025-04-10T22:31:58+08:00

    O padrão C++ especifica (de forma incompleta) o comportamento de uma máquina abstrata que executa o código que você escreve.

    Mapear isso para o hardware real fica por conta do compilador; desde que o programa resultante se comporte "como se" fosse a máquina abstrata, o programa estará em conformidade.

    Isso permite que os compiladores façam coisas como eliminar objetos completamente, desde que o programa se comporte "como se" o objeto existisse. Os bits reais no hardware em que o programa está sendo executado não são limitados, exceto que, em alguns casos, pode ser incrivelmente impraticável não se alinharem com os bits esperados.

    Esta opção "como se" é geralmente usada por compiladores em situações em que o compilador tem conhecimento quase total dos possíveis usos do objeto. Ou seja, variáveis ​​locais para as quais ninguém examina ponteiros. O padrão afirma que algumas operações são comportamentos indefinidos (percorrer a pilha manualmente, por exemplo, requer comportamento indefinido em C++); isso significa que ele pode provar que ninguém acessou "legalmente" uma variável e, como tal, a existência dessa variável pode ser eliminada (ou alterada para outra).

    No seu programa de exemplo, ninguém acessa x, então ele não precisa existir em tempo de execução. E, de fato, se você examinar o código produzido por um compilador otimizador, ele estará ausente.

    • 0

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