问题标签 [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.
c++ - 指针别名规则的应用(指向自身地址的指针)
我最近遇到了一个讨厌的 schrödinbug。在尝试将文件加载到平面内存表示中时,作者编写了如下代码:
所以,发生的事情是第一行代码基本上设置line->data
为等于&line->data
. 这是一个错误,因为对 所指向的值的任何更改line->data
也可能会更改其line->data
本身所指向的内容!
我当时很奇怪,问题发生需要很长时间。我的理解是,除非使用restrict
(或用于 g++/MSVC __restrict
)进行限定,否则编译器必须假定指针是别名的。因此,如果我设置line->data[0]
为某物,那么它将对下一次访问可见line->data[1]
,并且几乎可以肯定是无效的。然而,在调试器中,更改直到很久以后才可见,并且写入愉快地继续了一段时间。
我猜编译器(在本例中为 MSVC 2013)不认为自别名是可能的。这是允许的吗?
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++ 编译器特定关键字,但我想由于可移植性,这些不是一个选项。
c - 将受限指针分配给另一个指针,并使用第二个指针修改值是否合法?
以下方法是否尊重“限制”合同?
我的猜测是否定的,但我需要澄清一下。
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?
c - 我可以在这个函数中使用限制限定符吗?
我阅读了标准,但仍不能确定:
在函数repl
中,我曾经strchr
获取另一个用于修改对象的指针。我希望结果是第一个m
替换为M
.
但这可能是未定义的行为吗?
如果是,那么使用ap[cp-ap]='M';
代替*cp='M';
呢?
c - 指向 const 的指针是否与 __restrict 具有相同的效果?
当我们有常量数据时,例如在表格中
double const * const
或者double const *
这是否为编译器提供了与 / 相同的信息__restrict
是否具有相同的效果?
据我了解,__restrict
基本上承诺,指向的数据不会被/通过另一个指针更改。所以,指向 const 值的指针也做出了同样的承诺,不是吗?
__restrict
这里指的是 Visual Studio 中的关键字。我想在 GCC 中的含义是相似的。
c - 限制返回类型和局部变量
我非常了解何时将限制用于函数参数。但是到目前为止我发现的所有文章都没有提到其他声明(如函数返回值和局部变量)。
这是一个例子:
如果 alloc_foo() 和 alloc_bar() 保证返回非别名地址(比如如果有 malloc 的包装器),我应该让它们返回限制吗?我应该限制 foo 和 bar 吗?
c - 结构体中限制关键字的行为
场景:
假设我有一个struct
包含一堆指针的类型,所有这些指针都是声明的restrict
,以及一个将其中的几个struct
作为参数的函数,如下所示:
根据http://www.oracle.com/technetwork/server-storage/solaris10/cc-restrict-139391.html,将input.ptrXX
被input.ptrYY
视为非别名。
问题:
编译器是否也会将input.ptrXX
和output.ptrYY
视为非混叠?
c - 使用已在当前范围内受限的受限参数调用函数
我很难理解restrict
调用具有已经受限变量的函数的含义。
维基百科告诉我:
限制关键字是程序员给编译器的意图声明。它表示在指针的生命周期内,只有它或直接从它派生的值(例如指针 + 1)将用于访问它指向的对象。
我有这三个示例函数:
我会从一个函数中调用它们
他们中的哪一个会遵守函数声明所做的restrict
承诺?foo
这三种情况是:
函数
a
不会修改任何东西,所以肯定会成立。怎么样
b
,它的参数是从foo
' 指针“直接派生”的吗?foo
如果我修改p1
orp2
in ,我是否会打破我在声明中做出的承诺b
?如果参数没有以任何方式受到限制,情况是否会从以前的情况发生变化
c
,并且我编辑例如 p2 inc
?