问题标签 [restrict-qualifier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
65 浏览

c++ - 指针别名规则的应用(指向自身地址的指针)

我最近遇到了一个讨厌的 schrödinbug。在尝试将文件加载到平面内存表示中时,作者编写了如下代码:

所以,发生的事情是第一行代码基本上设置line->data为等于&line->data. 这是一个错误,因为对 所指向的值的任何更改line->data也可能会更改其line->data本身所指向的内容!

我当时很奇怪,问题发生需要很长时间。我的理解是,除非使用restrict(或用于 g++/MSVC __restrict)进行限定,否则编译器必须假定指针是别名的。因此,如果我设置line->data[0]为某物,那么它将对下一次访问可见line->data[1],并且几乎可以肯定是无效的。然而,在调试器中,更改直到很久以后才可见,并且写入愉快地继续了一段时间。

我猜编译器(在本例中为 MSVC 2013)不认为自别名是可能的。这是允许的吗?

0 投票
1 回答
397 浏览

c++ - 使用 Rcpp 构建包含 C 源代码和带有限制限定符的标头的 R 包?

我有一个用 C 编写的第三方源文件和相应的头文件(包含 GSL 的声明和包含指令等)。我正在尝试围绕这些源文件构建一个 R 包,基本上是使用 Rcpp 为函数制作一个包装器。问题是这些文件包含不属于 C++ 标准的限制限定符,因此 R CMD INSTALL 无法编译包。它确实对 .c 文件使用 C 编译器,但是想要用 C++ 编译器编译 .h 文件,但它失败了。当它在头文件(包含在 .cpp 文件中)中找到限制时,它会失败。

我对 C 和编译器以及 Rcpp 等不太熟悉,所以我不确定这里最好的方法是什么?

最简单的事情可能是删除限制关键字。这就是我目前所做的(当我从头文件中删除限制但将它们留给 .c 文件时,我很惊讶 R CMD INSTALL 工作)。但我宁愿不更改 .c 和 .h 文件,因为它们也被其他人(可执行文件和 Python)用于非 R 环境,并且所有项目都有相同的文件会很好。

我还尝试定义空关键字restrict,以便如果编译是在C++ 编译器中完成的,它只会从函数定义中“删除”限制,但我无法完成这项工作。我在某处读到过类似的方法,但显然它不起作用。

如果我能以某种方式告诉编译器(通过 Makevars 或其他什么?)特定的 .h 文件应该用 C 编译器编译,它会起作用吗?或者 C++ 函数调用这些函数会有问题吗?

或者,如果这些函数是通过 C++ 包装器从 R 调用的,那么整个关键字在性能方面是否也很重要?

一件事就是放弃 Rcpp 并使用 .C 而不是来自 R 的 .Call,但由于性能是这里的关键,这并不是一个好的选择,因为我知道 .Call 更快(并且更可靠)。

请注意,最终这个包可能会找到通往 CRAN 的方法,因此该解决方案应该是相当可移植的。似乎有一些用于限制的 C++ 编译器特定关键字,但我想由于可移植性,这些不是一个选项。

0 投票
4 回答
405 浏览

c - `const T *restrict` 是否保证指向的对象不被修改?

0 投票
1 回答
694 浏览

c - 将受限指针分配给另一个指针,并使用第二个指针修改值是否合法?

以下方法是否尊重“限制”合同?

我的猜测是否定的,但我需要澄清一下。

0 投票
1 回答
12313 浏览

c - What does (const char *restrict, ...) mean?

When I type printf, Xcode give me an autocomplete-hint like printf(const char *restrict, ...).

I want to know what does "const char *restrict mean?
And where can I find more information about these parameters which Xcode throws for every function?

0 投票
3 回答
108 浏览

c - 我可以在这个函数中使用限制限定符吗?

我阅读了标准,但仍不能确定:

在函数repl中,我曾经strchr获取另一个用于修改对象的指针。我希望结果是第一个m替换为M.

但这可能是未定义的行为吗?

如果是,那么使用ap[cp-ap]='M';代替*cp='M';呢?

0 投票
2 回答
134 浏览

c - 指向 const 的指针是否与 __restrict 具有相同的效果?

当我们有常量数据时,例如在表格中

  • double const * const或者
  • double const *

这是否为编译器提供了与 / 相同的信息__restrict是否具有相同的效果?

据我了解,__restrict基本上承诺,指向的数据不会被/通过另一个指针更改。所以,指向 const 值的指针也做出了同样的承诺,不是吗?

__restrict这里指的是 Visual Studio 中的关键字。我想在 GCC 中的含义是相似的。

0 投票
1 回答
222 浏览

c - 限制返回类型和局部变量

我非常了解何时将限制用于函数参数。但是到目前为止我发现的所有文章都没有提到其他声明(如函数返回值和局部变量)。

这是一个例子:

如果 alloc_foo() 和 alloc_bar() 保证返回非别名地址(比如如果有 malloc 的包装器),我应该让它们返回限制吗?我应该限制 foo 和 bar 吗?

0 投票
2 回答
613 浏览

c - 结构体中限制关键字的行为

场景:

假设我有一个struct包含一堆指针的类型,所有这些指针都是声明的restrict,以及一个将其中的几个struct作为参数的函数,如下所示:

根据http://www.oracle.com/technetwork/server-storage/solaris10/cc-restrict-139391.html,将input.ptrXXinput.ptrYY视为非别名。

问题:

编译器是否也会将input.ptrXXoutput.ptrYY视为非混叠?

0 投票
1 回答
507 浏览

c - 使用已在当前范围内受限的受限参数调用函数

我很难理解restrict调用具有已经受限变量的函数的含义。

维基百科告诉我:

限制关键字是程序员给编译器的意图声明。它表示在指针的生命周期内,只有它或直接从它派生的值(例如指针 + 1)将用于访问它指向的对象。

我有这三个示例函数:

我会从一个函数中调用它们

他们中的哪一个会遵守函数声明所做的restrict承诺?foo

这三种情况是:

  1. 函数a不会修改任何东西,所以肯定会成立。

  2. 怎么样b,它的参数是从foo' 指针“直接派生”的吗?foo如果我修改p1or p2in ,我是否会打破我在声明中做出的承诺b

  3. 如果参数没有以任何方式受到限制,情况是否会从以前的情况发生变化c,并且我编辑例如 p2 in c