如何告诉C或C++编译器指针没有别名
How to tell a C or a C++ compiler that pointers are not aliased
我有一个函数,它接收一个指针数组,比如:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j)
ptrs[num-1][i] += ptrs[j][i];
}
}
我想向编译器传达的是,指针ptrs[i]
不是彼此的别名,数组ptrs[i]
不重叠。我该怎么做?我不可告人的动机是鼓励自动向量化。
此外,有没有一种方法可以在std::vector
的迭代器上获得与__restrict__
相同的效果?
restrict
与更常见的const
不同,是指针的属性,而不是指向。因此,它属于'*
'声明符修饰符的右侧。参数声明中的[]
是编写*
的另一种方式。把这些东西放在一起,你应该能够通过这个功能原型获得你想要的效果:
void foo(int *restrict *restrict ptrs, int num, int size)
{
/* body */
}
并且不需要新名称。(未测试。您的里程可能会有所不同。restrict
只是一个纯粹的优化提示,实际上可能不会对您的编译器做任何建设性的事情。(
类似于:
void foo(int *ptrs[], int num, int size)
{
/* The body is an example only */
for (int i = 0; i < size; ++i) {
for (int j = 0; j < num-1; ++j) {
int * restrict a = ptrs[num-1];
int * restrict b = ptrs[j];
a[i] += b[i];
}
}
我认为应该在C99中做到这一点。我不认为C++有任何方法,但许多C++编译器也支持restrict。
在C++中,如果指针参数指向根本不同的类型("严格别名"规则(,则假设它们不别名。
在C99中,"restrict"关键字指定指针参数不别名任何其他指针参数。
调用std::memcpy
。如果您的语言/版本和编译器支持Memcpy的定义,则会设置restrict
;如果复制区域的大小较小,则大多数编译器会将其降低为向量指令。
相关文章:
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 动态维度数组的 C++ 别名指针
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 模板类函数指针类型别名
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- 如何正确组合类型的别名,功能指针和模板功能
- 这是否仍然声明一种指针函数的别名?
- 将共享指针的别名构造函数与空共享指针一起使用C++
- 指针、常量和类型别名
- 在 C++ 中作为指针或别名进行内部编译的引用
- 使用指针转换来存储/转换值:我打破了严格的别名规则吗
- 如何为 noexcept 函数指针创建别名
- 取消引用类型的punned指针将打破严格的别名规则[-Wstrict aliasing]
- 从成员函数指针到另一个类型的强制转换,返回严格的别名问题
- 指针别名规则的应用(指向自身地址的指针)
- 将char[]强制转换为usingned int给出:取消引用类型的punned指针将打破严格的别名规则
- 删除别名指针
- 如何告诉C或C++编译器指针没有别名
- 指针容器的指针别名