函数 return 可以作为限制指针的参数吗?
Can a function return an argument that is a restrict pointer?
假设我有一个函数接受 2 个非别名 int*
,并将一个 int
复制到另一个,然后 returns 作为 int*
目的地。
例如:
int* copy_int(int* restrict dest, int const* restrict src) {
*dest = *src;
return dest;
}
以下调用代码是否存在未定义行为?
void caller(void) {
int dest;
int src = 42;
copy_int(&dest, &src); // ignored return value aliases &dest
}
void caller(void) {
int dest;
int src = 42;
int* dest_addr = copy_int(&dest, &src); // dest_addr aliases &dest
}
void caller(void) {
int dest;
int src = 42;
int* dest_addr = &dest;
int* dest_addr_2 = copy_int(&dest, &src); // dest_addr_2 aliases dest_addr
}
或者我可以安全地假设 restrict
只适用于被调用者内部,并且我可以在函数调用之外为那些指针设置别名吗?
restrict
适用于函数可以假定的 copy_int(int* restrict dest, int const* restrict src)
内部 - 导致更好的优化代码。调用者有义务传递不重叠数据的地址。
所有案例在这方面都做同样的事情:copy_int(&dest, &src);
。 dest
和 src
没有互相混叠。 OP 提供的别名案例不影响 dest, src
.
下面的错误代码示例。
copy_int(&src, &src); // bad
假设我有一个函数接受 2 个非别名 int*
,并将一个 int
复制到另一个,然后 returns 作为 int*
目的地。
例如:
int* copy_int(int* restrict dest, int const* restrict src) {
*dest = *src;
return dest;
}
以下调用代码是否存在未定义行为?
void caller(void) {
int dest;
int src = 42;
copy_int(&dest, &src); // ignored return value aliases &dest
}
void caller(void) {
int dest;
int src = 42;
int* dest_addr = copy_int(&dest, &src); // dest_addr aliases &dest
}
void caller(void) {
int dest;
int src = 42;
int* dest_addr = &dest;
int* dest_addr_2 = copy_int(&dest, &src); // dest_addr_2 aliases dest_addr
}
或者我可以安全地假设 restrict
只适用于被调用者内部,并且我可以在函数调用之外为那些指针设置别名吗?
restrict
适用于函数可以假定的 copy_int(int* restrict dest, int const* restrict src)
内部 - 导致更好的优化代码。调用者有义务传递不重叠数据的地址。
所有案例在这方面都做同样的事情:copy_int(&dest, &src);
。 dest
和 src
没有互相混叠。 OP 提供的别名案例不影响 dest, src
.
下面的错误代码示例。
copy_int(&src, &src); // bad