问题标签 [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++ - 涉及限制关键字的编译器错误
我正在尝试在 OS X 10.8.2 上安装QMCPACK,但遇到很多这样的错误:
我不熟悉 restrict 关键字,但我觉得这可能是其他类型的问题,因为这是为其他人编译的流行代码。
这是该代码的完整上下文:
c - strtol 中的别名参数
以下是strtol
必须根据§ 7.22.1.4
C11 (n1570) 声明的方式:
据我所知,restrict
关键字意味着左值引用的对象*nptr
只能用它或直接从它派生的值来访问。
然而,很多程序员,甚至是有经验的程序员,都是strtol
这样使用的:
在这种情况下**endptr == **&p == *p == *nptr
, 和行为未定义。这样对吗?
objective-c - 为什么我可以修改 const __restrict 指针但不能修改 typdef 版本?
注意:我使用的是最新版本的 Xcode 附带的目标 C 编译器。
为什么这是合法的:
但是,如果我使用 typedef,它会做我认为应该做的事情。
那么,typedef 的情况有什么不同,我不明白什么?阅读 __restrict 让我的大脑受伤,我什至不确定这是否重要。
c - 如果某些限制指针指向同一个对象,为什么编译器不会生成警告或错误?
如果我们有一个函数:
原则上,这段代码可能会导致一些错误:
因为 in func
,*a
*b
*c
将是同一个对象。但是为什么这段代码可以编译成功呢?
c++ - 将变量定义为自动限制
据我了解restrict
,它将指针标记为对函数中特定数据的唯一引用。我通常看到它在函数参数中使用,但这似乎也是有益的:
(所以编译器知道改变a
永远不会改变b
,并且可以做额外的优化)。
如果get_some_string
返回一个很复杂的类型,似乎最好使用auto
关键字;
但是使用auto restrict
会触发错误“限制需要指针”。那么,我该如何结合这些呢?
如评论中所述,restrict
不是 C++ 中的标准关键字;我忘记了#define restrict __restrict__
我的项目中有一条线,它适用于 GCC。
c - 在某些情况下,你可以使用受限指针来访问同一个对象吗?
大多数限制的定义都表示,程序员向编译器承诺,在指针的生命周期内,指针是访问对象的唯一方式。这允许编译器优化输出,因为它知道它只能由一个指针访问,因此只能由它更改。如果我理解正确,这通常意味着程序不必重新加载指针指向的值。
如果这是正确的,那么当限制关键字应该可用时应该有一些例外,即使它违背了应该如何使用它的意图。
想到的一件事是当指针指向的数据在指针的生命周期内从未真正改变时。在这种情况下,即使指针指向相同的位置,也无需重新加载数据,因为它们在指针的生命周期内不会改变。例如:
这是对限制的有效使用,即使它违背了它应该如何使用?像这样使用限制关键字会导致未定义的行为吗?
c - 兼容类型和参数类型限定符
这两个声明的类型是否兼容?
或类似地:
我很难在标准中找到涵盖该问题的任何内容。我最感兴趣的主题是手动原型化函数是否有效,省略了restrict关键字,其中实际类型可能具有限制限定的参数,具体取决于C的版本或正在使用的其他库的版本。
c++ - 使用 Visual C++ 将函数标记为没有副作用
考虑以下(有点构思)的例子:
能够告诉编译器mystrlen()
没有副作用,因此它可以重用旧结果mystrlen(text)
而不是调用它两次,这将是非常好的。
我在文档中没有找到任何关于它的内容,restrict
或者它的其中一个差异似乎也不起作用。查看所有优化 (switch /Ox
) 的输出代码表明编译器确实生成了两个调用。如果我将这两个功能放在一个模块中,它甚至会这样做。
对此有任何解决方案,或者任何人都可以确认 VC++ 中没有解决方案吗?
c - 对数组使用限制?
有没有办法告诉 C99 编译器我要访问给定数组的唯一方法是使用 myarray[index] ?说这样的话:
通过使用限制,我承诺我不会为 range1 和 range2 设置别名,但是我如何为函数内声明的数组做同样的事情?