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

Cor*_*lks 1 c pointers restrict

题:

如果我有两个指针(基本上是a begin和a end),它们是合格的restrict.所述begin指针被用于非关联化/读取,和所述end指针是一过去最端指针被解除引用从未和仅用于(通过检查范围的大小end - begin).一旦消耗了范围,我期望begin并且end相等并且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;
}
Run Code Online (Sandbox Code Playgroud)

我想改变它,以便不必修改它们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;
}
Run Code Online (Sandbox Code Playgroud)

鉴于restrict对指针的限制,这是允许的吗?

Joh*_*ger 5

TL; DR:我在阅读标准时允许您使用.

使用restrict-qualified指针的标准要求都与别名和对指向对象的访问有关.我发现使用这样的指针作为指针差异operator(-)的操作数没有限制,并且这些限制与目的不一致restrict(这是为了提供更大的优化机会).

相反,restrict通过添加整数从合格指针获得的指针值在某种意义上"基于"原始指针对标准是重要的.粗略地说,通过这样的指针访问指向对象是可以接受的,而通过指向不是"基于"受限指针的同一对象的指针来访问该对象是不可接受的.

另外,我认为Reader.end不需要restrict资格,我认为这样的资格根本不会对你有所帮助.但是,您必须确保既不使用Reader.end也不使用任何指针来访问数据; 你必须只Reader.data使用它.在main()也.另一方面,如果你无处修改指向对象,几乎所有这些都没有实际意义.