gpt4 book ai didi

我可以减去或比较受限制的指针吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:13 25 4
gpt4 key购买 nike

问题:

如果我有两个指针(本质上是一个 begin 和一个 end),它们用 restrict 限定。 begin 指针用于解引用/读取,end 指针是一个永远不会解引用的尾后指针,仅用于检查大小范围(通过 end - begin)。一旦使用了范围,我希望 beginend 相等并且 end - begin 为 0,尽管此时两个指针将永远不会被取消引用。

鉴于 restrict 对指针的限制,减去和比较这两个指针是否是明确定义的行为?

MVCE:

我有一些代码如下:

#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;
}

我想更改它以便在读取时不必同时修改 datasize ,只需要修改 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/

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