问题标签 [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 - 通过示例了解限制限定符
关键字的restrict
行为在 C99 中由 6.7.3.1 定义:
令 D 是一个普通标识符的声明,它提供了一种将对象 P 指定为指向类型 T 的限制限定指针的方法。
如果 D 出现在一个块内并且没有存储类 extern,则让 B 表示该块。如果 D 出现在函数定义的参数声明列表中,则让 B 表示关联的块。否则,让 B 表示 main 块(或在独立环境中程序启动时调用的任何函数块)。
在下文中,如果(在对 E 求值之前执行 B 的某个序列点)修改 P 以指向它以前指向的数组对象的副本,则称指针表达式 E 基于对象 P将改变 E.119 的值)请注意,“基于”仅针对具有指针类型的表达式定义。
在每次执行 B 期间,令 L 为基于 P 具有 &L 的任何左值。如果 L 用于访问它指定的对象 X 的值,并且 X 也被修改(通过任何方式),则适用以下要求: T 不应是 const 限定的。用于访问 X 值的每个其他左值也应具有基于 P 的地址。就本子条款而言,修改 X 的每个访问也应视为修改 P。如果为 P 分配了一个指针表达式 E 的值,该指针表达式 E 基于与块 B2 关联的另一个受限指针对象 P2,则 B2 的执行应在 B 的执行之前开始,或者 B2 的执行应在任务。如果不满足这些要求,则行为未定义。
和其他人一样,我很难理解这个定义的所有复杂性。作为对这个问题的回答,对于第 4 段中的每个要求,我希望看到一组很好的示例,说明会违反要求的用法。本文:
用“编译器可能假设......”的方式很好地呈现规则;扩展该模式并结合编译器可以做出的假设,以及它们如何无法保持,每个示例都会很棒。
c - 混淆调整代码以使用限制限定符
我正在尝试调整以下版本的stpcpy
函数以使用restrict
-qualified 指针作为其参数和内部,但我不确定简单地添加限定符是否会导致引入未定义的行为。
假设 C99 6.7.3.1 中关于访问对象的规则仅适用于访问的单个对象而不是整个数组,我认为这可能没问题,因为写入的元素只能访问一次,并且只能用于写入。但我restrict
在这一点上使用起来很不舒服,不想仅仅依靠我自己的判断。
c - 为什么限制指针没有效果
对于限制指针,我看不出 gcc 的代码有任何差异。
文件 1
文件2
编译
file1.s和file2.s都相同,除了.file
告诉文件名的行:
这两个代码都从内存中读取,然后将指向的内存位置分配a
给b
。我预计该restrict
版本不会重新读取and 的地址,a
并且andb
的地址将在寄存器中递增并在最后写入内存。a
b
我做错了什么吗?或者示例的选择可以吗?
我尝试使用不同的开关-O0
, -O1
, -O2
, -O3
, -Ofast
, 并-fstrict-aliasing
为两个文件使用相同的结果。
注意: gcc --version = gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
编辑代码已更改。
c++ - clang++ 是否支持 __restrict?
以下代码使用 g++ 4.7.1 编译,但不是 clang 3.1
铿锵支持__restrict
吗?还是使用特定的语法?
c++ - 调用一个函数并传递一个限制限定的指针是否危险?
考虑这两个函数:
正如ptr
在 中声明__restrict
的那样bar
,打电话foo()
危险吗?localPtr
所谓危险,我的意思是重叠指向的内存区域ptr
。对此有何指导方针?
c++ - 我应该在引用上使用 __restrict 吗?
在我正在编码的程序中,我的一个函数声明如下所示:
当我使用 Microsoft Visual Studio 2010 Express 编译代码时,编译器会抱怨:
警告 C4227:使用不合时宜:忽略引用的限定符
但是,GCC 文档的这一页说:
除了允许使用受限指针之外,您还可以指定受限引用,这表明该引用在本地上下文中没有别名。
同一页给出了一个非常明确的例子:
我误解了 MVSC 的警告吗?还是应该将所有引用转换为指针以便__restrict
适用?
c - 我使用限制限定符时出现错误
当我编译以下程序时出现错误:
为什么我会收到这些错误?
c - 限制结构内的关键字和指针
通过使用这样的restrict
关键字:
我可以指示编译器数组 a 和 b 不重叠。假设我有一个结构:
并编写一个接受两个struct s
对象的函数:
在这种情况下,我如何类似地指示编译器a.ip
并且b.ip
不重叠?
c - __restrict 是否允许忽略严格的别名规则?
假设我有一个字符缓冲区,我想避免使用 memcpy,并通过 int* 变量访问它:
现在这当然会打印“a”。
我可以在不遇到未定义行为的情况下执行此操作吗?
c - tmpfile_s 中限制的目的是什么?
来自 C11 草案:
C11 (n1570), § K.3.5.1.1
tmpfile_s
功能
errno_t tmpfile_s(FILE * restrict * restrict streamptr);
这里限定词的目的是什么restrict
?
因为没有其他参数,编译器能够知道streamptr
没有别名restrict
,不是吗?