c - 是否应该在可用的地方使用命名地址空间?

标签 c pointers memory-address

有些架构具有多个地址空间,著名的例子是真正的哈佛大学,但例如 OpenCL 也具有此属性。

C 编译器可能会为此提供一些解决方案,其中之一是命名地址空间,支持特殊的指针限定符来指示指针的地址空间,但也可能存在其他解决方案。

我不知道它们,在我使用的架构(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/

相关文章:

c++ - G++ 编译器在每次运行后返回相同的变量地址(即使在名称更改后)

c++ - C字符串和C++字符串有什么区别?

c - 使用Linux C select系统调用来监视文件

c - 计算矩阵每个元素的指数的最有效方法

我可以在 for block 中使用 uint64_t 吗?

C++ 指向函数的指针,初学者问题

花括号在 C 语言的正则表达式中不起作用

C - 来自先前分配的 void* 的 sizeof 值?

delphi - Delphi 中通过内存地址调用可变参数 C 函数

memory - 为什么要保留内存地址 0x0,为什么要保留?