有些架构具有多个地址空间,著名的例子是真正的哈佛大学,但例如 OpenCL 也具有此属性。
C 编译器可能会为此提供一些解决方案,其中之一是命名地址空间,支持特殊的指针限定符来指示指针的地址空间,但也可能存在其他解决方案。
- 对于 GCC,相应的文档在此处:https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Named-Address-Spaces.html
- 针对 AVR 的 IAR,相应的文档在此处:https://www.iar.com/support/tech-notes/compiler/strings-with-iccavr-2.x/ (请注意,这早于 GCC 的支持,GCC 可能针对 8 位 AVR 目标进行了调整)。
- 对于 SDCC(小型设备 C 编译器):http://sdcc.sourceforge.net/doc/sdccman.pdf ,从第 36 页开始。涵盖 8051、Z80 和 68HC08 等微 Controller 。
- OpenCL 的一些信息:https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/local.html和 https://software.intel.com/en-us/articles/the-generic-address-space-in-opencl-20
我不知道它们,在我使用的架构(8 位 AVR)上,有另一种解决方案来处理这个问题,专门的宏(pgmspace.h
)可以工作与ROM中的数据。但是这些没有类型检查,并且它们(在我看来)使代码变得丑陋,所以在我看来,使用命名地址空间是一种更好的,甚至可能更便携的方式来处理问题(便携通过为地址空间限定符提供空定义,可以轻松地将此类软件移植到具有单一地址空间的目标。
然而,在我从它们的可用性中了解到的上一个问题中,建议使用命名地址空间的解决方案遭到严重否决,此处:How to make two otherwise identical pointer types incompatible
反对者没有提供任何解释,我自己也没有找到任何解释,对我来说,命名地址空间似乎是处理问题的一种很好且功能完美的方法。
谁能解释一下?为什么可能不应该使用命名地址空间? (支持在具有多个不同地址空间的目标上可用的任何其他方法)
最佳答案
另一种方法是窃取 Linux 内核和 smatch 等工具中使用的技术。
Linux 有这样的定义
#define __用户
这意味着代码可以说类似 int foo(const __user char *p) 的东西。编译器会忽略 __user,但会使用诸如 smatch 之类的工具来确保指针不会意外地在命名空间之间徘徊。
关于c - 是否应该在可用的地方使用命名地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50326992/