- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我有两个指针(本质上是一个 begin
和一个 end
),它们用 restrict
限定。 begin
指针用于解引用/读取,end
指针是一个永远不会解引用的尾后指针,仅用于检查大小范围(通过 end - begin
)。一旦使用了范围,我希望 begin
和 end
相等并且 end - begin
为 0,尽管此时两个指针将永远不会被取消引用。
鉴于 restrict
对指针的限制,减去和比较这两个指针是否是明确定义的行为?
我有一些代码如下:
#include <stddef.h>
struct Reader {
const char* restrict data;
size_t size;
};
char read_char(struct Reader* reader) {
--reader->size;
return *reader->data++;
}
int main(int argc, char* argv[]) {
struct Reader reader = {
.data = argv[1],
.size = argv[1] ? strlen(argv[1]) : 0,
};
if (reader.size > 0) {
return read_char(&reader);
}
return 0;
}
我想更改它以便在读取时不必同时修改 data
和 size
,只需要修改 data
修改:
#include <stddef.h>
struct Reader {
const char* restrict data;
const char* restrict end; // Not sure if this should be restrict or not.
};
char read_char(struct Reader* reader) {
return *reader->data++;
}
int main(int argc, char* argv[]) {
struct Reader reader = {
.data = argv[1],
.end = argv[1] + (argv[1] ? strlen(argv[1]) : 0),
};
if (reader.end - reader.data > 0) { // Is this okay?
return read_char(&reader);
}
return 0;
}
考虑到 restrict
对指针的限制,这是允许的吗?
最佳答案
TL;DR:根据我对标准的阅读,您的使用是允许的。
标准对使用 restrict
限定指针的要求都与别名和对指向对象的访问有关。我发现使用此类指针作为指针差分运算符 (-
) 的操作数没有任何限制,并且此类限制不符合 restrict
的目的(即提供更大的优化机会)。
相比之下,通过添加一个整数从 restrict
限定指针获得的指针值在某种意义上“基于”原始指针,这对标准很重要。粗略地说,通过这样的指针访问指向的对象是可以接受的,而通过指向不“基于”受限指针的同一对象的指针访问该对象是 Not Acceptable 。
此外,我认为 Reader.end
不需要 restrict
限定,而且我认为这样的限定对您根本没有帮助。但是,您必须确保既不使用 Reader.end
也不派生任何指针来访问数据;为此,您必须只使用 Reader.data
。在 main()
中也是如此。另一方面,如果您无处修改指向的对象,几乎所有这些都没有实际意义。
关于我可以减去或比较受限制的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724583/
我确信一定有什么东西可以为我做到这一点。 我有一个显示项目列表的网络用户界面。如果你点击一个项目,会发生两件事: UI 将使用立即可用的信息进行更新,然后将发出异步请求以获取更多信息。完成后,它将更新
我是一名优秀的程序员,十分优秀!