问题标签 [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++ - GCC C++ 编译器是否考虑 __restrict - 语句?
当通过 GCC 编译器编译它时,我已经研究了在 C++ 代码中 __restricting 某些指针的效果。
事实证明,不仅运行时保持不变,而且可执行文件似乎没有改变,字节大小与以前完全相同。
我的 GCC 版本是
尽管它在解析时接受了这个 C++ 扩展,但在组装代码时似乎并不考虑它。所以有一个原因,编译器不知道如何使用这个语义信息,或者处理这个信息被完全禁用。
该代码执行了大量的数字运算,它希望启用它以用于测试目的。你能帮我吗?
c - 受限指针问题
我对限制指针的规则有点困惑。也许有人可以帮助我。
如下定义嵌套的受限指针是否合法:
/li>如下推导受限指针值是否合法:
/li>
谢谢!安德鲁
c - 受限指针分配
我有一个关于受限指针分配的问题。有关特定问题,请参阅代码中的注释。总的来说,我只是想知道限制是合法的(我已经阅读了标准,但仍然有问题:-(
谢谢你的帮助!
c - 这是对限制指针的无效使用吗?
假设我有一个大数组,我计算一个索引并传递给第二个函数。举个简单的例子,比如:
这是否违反了 bar() 中的限制规则,您将数组的一部分的地址传递给 foo(),即使您从未真正在 bar() 中为数组的一部分使用别名?
c - 在 C 中使用限制指针时,可以使用其初始标识符更改变量吗?
在 C 中使用restrict
指针时,可以使用其初始标识符更改变量吗?例如:
...在创建fooPtr后,我通过foo更改了foo的值。restrict
第 1 部分对我来说看起来不错。我对第 2 部分感到困惑。根据我的理解restrict
,第 3 部分很糟糕(编译器允许这样做,但它的行为是未定义的,程序员不这样做)。
c - C 使用 typedef 限制
我现在正在做一些代码并且使用限制关键字遇到了一些问题。
如果我想限制 a 和 b 怎么办?下面的代码失败:
提前致谢。
c - 检查 __restrict 关键字可用性的好方法是什么?
我正在寻找一组's 来检查GCC 和 Visual Studio#ifdef
的关键字的可用性。__restrict
我假设它需要检查编译器版本,但我不知道它是针对哪个版本引入的。任何人都可以帮助我吗?
更新:当编译为 C89 时,这必须(并且只需要)工作!所以我不能指望__STDC_VERSION__
C99 或 C99 支持。
c++ - 防止两个对象内部出现混叠
我有一个与此类似的函数签名
在内部,矩阵类有一个float* data;
表示m x n
组件的。我想告诉编译器,a
不要b
给输出矩阵加上别名,这样它就不会做大量的加载存储。
我该怎么做呢?我知道我可以传入指向函数签名的指针并用__restrict
(在 MSVC 中)标记指针,但我想保留通过引用传递的对象的习语,其中对象包含指向内存的指针。
我也知道这__restrict
不适用于对象引用。
c - C99:限制指向文档线程安全的指针?
这个问题不是关于受限的技术使用,更多的是关于主观使用。虽然我可能会误认为限制在技术上是如何工作的,但在这种情况下,您应该随时指责我基于错误前提提出问题。
以下是到目前为止我如何使用受限的两个示例:
如果我有一个函数需要一个指向不可变字符序列的指针,我不会说它受到限制,因为其他人可以在函数执行的同时通过他们自己的指针访问数据,例如从另一个并行线。数据没有被修改,所以没问题。
但是,如果函数接受一个指向它可能修改的可变字符序列的指针,我说它是受限制的,因为在执行由于数据可能不一致而导致的函数。它还说明了数据被修改的可能性,因此编码人员知道不要读取过时的数据,并且他们应该在访问时使用内存屏障或其他...
我没有编写太多 C 代码,所以我很容易对我在这里的假设有所误解。这是限制的正确用法吗?在这种情况下值得做吗?
我还假设一旦函数返回时将受限指针从堆栈中弹出,然后可以再次通过任何其他指针自由访问数据,并且限制只持续与受限指针一样长。我知道这依赖于遵循规则的编码器,因为通过“非官方”指针访问受限数据是 UB。
我做对了这一切吗?
编辑:
我想明确一点,我已经知道它绝对不会阻止用户通过多个线程访问数据,而且我也知道 C89 甚至不知道“线程”是什么。
但是考虑到可以通过引用修改参数的任何上下文,很明显在函数运行时不能访问它。这对强制线程安全没有任何作用,但它确实清楚地记录了您在函数执行期间通过自己的指针修改数据,风险自负。
即使线程完全被排除在外,您仍然允许在我认为正确的情况下进行进一步优化。
即便如此,感谢您迄今为止提供的所有权威答案。我是赞成所有我喜欢的答案,还是只赞成我接受的答案?如果接受多于一个怎么办?抱歉,我是新来的,我现在会更彻底地查看常见问题解答...
c++ - 限制成员函数的限定符(限制 this 指针)
注意:为了澄清,问题不是关于restrict
关键字的一般使用,而是具体关于将其应用于成员函数,如此处所述。
gcc 允许您在成员函数上使用__restrict__
(相当于 C99 的 GNU++ restrict
)限定符,有效地this
在函数范围内创建一个限制限定指针。牛肉在哪里?
大多数成员函数在其他成员上工作,通过 访问它们this
,这是一个T* const
(并且通常是无别名的)。为了this
可能被别名,需要在成员函数中以某种方式使用第二个指向类型的指针,并且它必须来自某个地方。
这是非成员函数经常出现的情况,例如所有二元运算符或任何其他自由函数,它们至少需要两个相同的非平凡类型的指针或引用。但是,这些函数没有 a this
,因此它们不相关。
赋值运算符、复制构造函数和一元比较运算符是原则上可以使用别名的成员函数的示例this
( 因为另一个对象是通过引用传递的)。因此,为这些分配一个限制限定符才真正有意义——编译器应该已经很明显所有其他函数都具有限制属性(因为从来没有第二个指向 T 的指针)。
现在,例如,如果您使用restrict
onoperator=
您应该因此根本不检查自分配,因为您说的this
是在该函数的范围内没有别名(如果这是真的,则不可能发生自分配)。
显然,这是你不可能事先知道的事情,也是没有意义的事情。
那么,在什么情况下,人们实际上想要给成员函数一个限制限定符,并且它在哪里有意义?