gpt4 book ai didi

c - 编译器可以删除局部变量以支持多个内存访问吗?

转载 作者:行者123 更新时间:2023-12-05 04:39:50 24 4
gpt4 key购买 nike

我们讨论了如何确保某些共享(不受信任)内存区域中的数据仅被访问一次,复制到本地内存,然后从那里进行检查和处理。环境是一个嵌入式多核 µC,带有用于 IPC 的共享 RAM,代码是用 C99 编写的。目前,我们基本上做 Type local_copy = *(Type*)shared_memory_pointer; 然后只在 local_copy 之后操作。

现在一个同事提出了一个问题,是否允许编译器不执行复制到本地内存,而是在下面直接访问 shared_memory_pointer 中的数据,这(理论上)允许用于在使用数据时对其进行操作。

编译器有可能做到这一点吗?如果是这样,我们如何确保它不会发生?如果不是,请解释详情。

谢谢大家!

编辑:有问题的内核上没有操作系统,它是一个裸机系统。

最佳答案

whether the compiler was allowed to not perform the copy into local memory and instead access the data at shared_memory_pointer directly

是的,允许编译器这样做。您可以强制读取的唯一场景是通过 volatile 限定访问。在您的情况下,局部变量和强制转换都应该是 volatile 限定的。

但是请注意...

  • volatile 不能解决重入问题。您需要互斥体、关键部分或类似方法来阻止代码出现竞争条件错误。使用操作系统提供的方法。
  • Type local_copy = *(Type*)shared_memory_pointer; 是非常可疑的代码,表明您的程序中存在未定义的行为或与类型相关的错误。像这样的野生类型双关语可能会导致错位、不正确的严格指针别名优化、丢弃的限定符等等——所有这些都是未定义的行为。此外,如果您选择了合适的类型,则无需首先进行强制转换。

关于c - 编译器可以删除局部变量以支持多个内存访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70391384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com