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 / 79429382
Accepted
Badasahog
Badasahog
Asked: 2025-02-11 16:54:32 +0800 CST2025-02-11 16:54:32 +0800 CST 2025-02-11 16:54:32 +0800 CST

cargas sequenciais não voláteis garantem correção quando usadas nas proximidades de remapeamento de memória?

  • 772

Estou ciente de que múltiplas cargas não voláteis podem ser colapsadas em uma única carga pelo compilador. Isso significa que funções de mapeamento de memória podem criar comportamento indefinido?

por exemplo:

int k = *p;

unmapFile(fm, fileHandle1);//the unmapped memory includes the address pointed to by p

//p is no longer valid, pointing to a virtual address that is unmapped

mapFile(fm, fileHanlde2);//p now points to an address somewhere in a different file

int j = *p;

//use k and j here

as duas desreferências de p podem ser reunidas em uma, fazendo com que o código se comporte de forma imprevisível?

como um aparte, eu sei que funções de mapeamento de arquivo não permitem que você especifique o endereço inicial do mapa (pelo menos em posix e windows), mas essa foi a hipótese mais simples que eu consegui pensar. De fato, há casos de uso para esse paradigma.

c
  • 2 2 respostas
  • 67 Views

2 respostas

  • Voted
  1. Best Answer
    John Bollinger
    2025-02-11T23:28:05+08:002025-02-11T23:28:05+08:00

    Isso significa que as funções de mapeamento de memória podem criar comportamento indefinido?

    O C em si não define nenhuma dessas funções ou fala sobre como elas poderiam ou deveriam funcionar se definidas. Portanto, no que diz respeito à especificação da linguagem C, tudo e qualquer coisa associada a funções de mapeamento de memória tem comportamento indefinido. Não há outra resposta no nível de generalidade da questão. Como @AtsushiYokoyama observa , há questões práticas que podem dissuadir o compilador de combinar as duas leituras de *p, mas isso não deve ser tomado como garantia de que qualquer compilador dado de fato não as combinará.

    Em um ambiente de programação e execução que disponibiliza funções de mapeamento de memória, a maioria dos detalhes relacionados ao seu comportamento, na medida em que são definidos, são específicos da implementação. Considerando um ambiente POSIX que suporta mapeamentos de arquivo e as funções POSIX mmap()e munmap()como exemplo, POSIX diz:

    A munmap()função deve remover quaisquer mapeamentos para aquelas páginas inteiras contendo qualquer parte do espaço de endereço do processo começando em addre continuando por lenbytes. Outras referências a essas páginas devem resultar na geração de um SIGSEGVsinal para o processo.

    E diz:

    A mmap()função deve estabelecer um mapeamento entre o espaço de endereço do processo em um endereço pade lenbytes para o objeto de memória representado pelo descritor de arquivo fildesno deslocamento offde lenbytes [...]

    e

    O mapeamento estabelecido por mmap()substituirá quaisquer mapeamentos anteriores para todas as páginas que contenham qualquer parte do espaço de endereço do processo, começando em pae continuando por lenbytes.

    É responsabilidade do compilador garantir que quaisquer otimizações que ele execute preservem a semântica do programa conforme definido pela combinação de todas as especificações relevantes. Não vejo nenhuma maneira de um compilador para um ambiente POSIX onde your unmapFile()corresponde a munmap()e your mapFile()corresponde mmap()a justificar a combinação das duas leituras de *p. Isso não significa que nenhum compilador faria isso, mas significa que um compilador que fizesse isso correria o risco de produzir um comportamento de programa que não estivesse em conformidade com POSIX. Para este caso, então, eu reforçaria minha observação acima para: há questões práticas que devem dissuadir o compilador de combinar as duas leituras de*p .

    • 2
  2. Atsushi Yokoyama
    2025-02-11T18:17:25+08:002025-02-11T18:17:25+08:00

    Quando o compilador realiza otimização neste tipo de código, se ele não conhece a implementação de unmapFile()ou mapFile()(por exemplo, se são funções externas), então, em geral , as duas referências por meio de ponteiro nãop serão colapsadas em uma. Isso ocorre porque o compilador não pode garantir que essas funções não tenham efeitos colaterais que afetem a referência a .p

    Por outro lado, se o compilador conhece a implementação de unmapFile()e mapFile()(por exemplo, se são inline staticfunções) e está confiante de que essas funções não afetam a referência a p, então ele pode colapsar as referências por meio de p.

    Claro, como você ressaltou, se forem volatile, a história seria diferente.

    Espero que isso ajude!

    • 1

relate perguntas

  • Multiplicação mais rápida que *

  • Usando uma macro para comprimento de string no especificador de formato scanf () em C

  • Como você pode definir o tipo de dados de #define para long double?

  • Ponteiros const incompatíveis

  • Mudança de cor não gradual no OpenGL

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