问题标签 [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 投票
3 回答
1300 浏览

c++ - 如何告诉 C 或 C++ 编译器指针没有别名

我有一个接收指针数组的函数,如下所示:

我想传达给编译器的是指针ptrs[i]不是彼此的别名,并且数组ptrs[i]不重叠。我该怎么做?我别有用心是鼓励自动矢量化。

__restrict__另外,有没有办法获得与a 的迭代器相同的效果std::vector

0 投票
2 回答
338 浏览

c++ - __restrict 和 shared_ptr hack

以下安全吗?

注意 foo 和 bar 上的 __restrict。

目标是在所有对象别名都已死亡时分配内存自毁。

0 投票
2 回答
5606 浏览

cuda - CUDA:如何在指向数组的指针数组上应用 __restrict__?

__restrict__这个使用两个int 数组的内核编译得很好:

但是,组成指针数组的相同的两个 int 数组无法编译:

编译器给出的错误是:

我有某些结构组成一个指向数组的指针数组。(例如,传递给内核的结构具有int* arr[16].)我如何将它们传递给内核并能够应用于__restrict__它们?

0 投票
1 回答
1472 浏览

c - `volatile restrict`指针有实际用途吗?

const volatile我可以看到合格变量 的实际用途,例如

如果底层硬件机制每秒更新一次值,但变量在(可能是嵌入式的)硬件中不可写。并且由于所有三个(C11 中为四个)类型限定符都被认为是独立的,所有组合似乎都是允许的。但是我无法想象一个restrict volatile合格的指针真正有意义的现实情况:

[编辑:澄清:两者都volatile适用restrict于指针,而不是指向的对象!]

这是语言允许但本身无用的构造,还是我错过了一些有价值的应用领域?

0 投票
2 回答
926 浏览

c++ - __restrict__ 可以应用于 shared_ptr?

智能指针是下面的指针,那么有没有办法将shared_ptr函数的参数定义为不别名 anothershared_ptr或任何类型的另一个指针?

还是出于某种原因,这是不必要的?

我关心 gcc >=4.2 和 llvm-clang >=2.0 编译器(其他编译器的答案也很有趣)。

0 投票
2 回答
1648 浏览

c - 如何在 GCC 上移植 __declspec(noalias)

如果我理解正确,__declspec(noalias)则告诉编译器作为参数传递的指针都没有别名。

换一种说法,如果我没记错的话,它完全等同于调用__restrict指针类型的每个参数。但是有没有办法在不改变所有函数调用的情况下做到这一点?理想情况下,我会用__declspec(noalias)预处理器定义替换它。

0 投票
1 回答
1337 浏览

c++ - 具有限制指针的 OpenMP 因 ICC 失败而 GCC/G++ 成功

我使用乘法循环中的隐式 openMP 指令为CRS中的稀疏矩阵实现了一个简单的矩阵向量乘法。

完整的代码在 GitHub 中:https
://github.com/torbjoernk/openMP-Examples/blob/icc_gcc_problem/matxvec_sparse/matxvec_sparse.cpp 注意:很丑;-)

为了控制私有和共享内存,我使用了限制指针。%u在 64 位 Linux 上使用 GCC 4.6.3 编译它可以正常工作(除了两个关于命令和命令unsigned int的警告printf,但这不是重点)。

但是,在 64 位 Linux 上使用 ICC 12.1.0 编译它失败并出现以下错误:

有问题的变量和指针的定义

和 openMP 指令定义为

用 g++ 编译:

用icc编译:


  • 使用 GCC/ICC 是否有错误?
  • 这是我的代码中的设计问题导致未定义的行为吗?
    如果是这样,哪条线路是/正在导致它?
  • 只是ICC和GCC之间的不一致吗?
    如果是这样,实现编译器独立性和兼容性的好方法是什么?
0 投票
1 回答
477 浏览

c - c99 __restrict 和编译器优化

对于 Intel 编译器 11.1 版和 gcc 4.6 版,编译器似乎为最后 4 个语句中的每一个重新加载 my_s1_ptr->field1。我对 __restrict 的理解会告诉我最后 3 个负载应该是多余的并且可以被消除。是的,我知道代码很奇怪,但它的结构是这样的。我只是希望能够让编译器消除冗余负载。知道如何说服它这样做吗?

0 投票
1 回答
1194 浏览

c++ - 限制指针和内联

我曾尝试使用限制限定指针,但遇到了问题。下面的程序只是一个简单的程序,仅用于提出问题。

calc_function 使用三个指针,这是受限制的,因此它们“应”不相互别名。在 Visual Studio 中编译此代码时,该函数将被内联,因此 Visual Studio 2010 无缘无故忽略限定符。如果我禁用内联,代码的执行速度会快六倍(从 2200 毫秒到 360 毫秒)。但我不想在整个项目或整个文件中禁用内联(因为那样会在所有 getter 和 setter 中调用开销,这将是可怕的)。

(可能唯一的解决方案是仅禁用此函数的内联吗?)

我试图在函数中创建临时限制限定指针,在顶部和内部循环中试图告诉编译器我保证没有别名,但编译器不会相信我,它不会工作。我也尝试过调整编译器设置,但我发现唯一可行的是禁用内联。

我会很感激一些帮助来解决这个优化问题。

要运行程序(在 realease 模式下)不要忘记使用参数 0 1000 2000。为什么使用用户输入/程序参数是为了确保编译器无法知道指针之间是否存在别名a、b 和 c。

0 投票
4 回答
649 浏览

c - restrict keyword - optimization and aliasing implications

I came across these two sections in C11 standard referring to the restrict qualifier:

1#

6.7.3-8

An object that is accessed through a restrict-qualified pointer has a special association with that pointer. This association, defined in 6.7.3.1 below, requires that all accesses to that object use, directly or indirectly, the value of that particular pointer.135) The intended use of the restrict qualifier (like the register storage class) is to promote optimization, and deleting all instances of the qualifier from all preprocessing translation units composing a conforming program does not change its meaning (i.e., observable behavior).

Can you explain me the meaning of the cursive fragment? In my interpretation, since it doesn't change its meaning, it looks like that the using of restrict is just pointless...

2#

6.7.3.1-6

A translator is free to ignore any or all aliasing implications of uses of restrict.

What might these aliasing implications be? Can you show me some examples?