C 函数能否返回作为限制指针的参数?
假设我有一个函数,它接受两个无别名的C 函数能否返回作为限制指针的参数?,c,pointers,restrict-qualifier,C,Pointers,Restrict Qualifier,假设我有一个函数,它接受两个无别名的int*,并将一个int复制到另一个,然后返回作为目标的int*。 例如: int*copy\u int(int*restrict dest,int const*restrict src){ *dest=*src; 返回目的地; } 以下调用代码是否有未定义的行为 void调用方(void){ int dest; int src=42; copy_int(&dest,&src);//忽略返回值别名&dest } void调用方(void){ int des
int*
,并将一个int
复制到另一个,然后返回作为目标的int*
。
例如:
int*copy\u int(int*restrict dest,int const*restrict src){
*dest=*src;
返回目的地;
}
以下调用代码是否有未定义的行为
void调用方(void){
int dest;
int src=42;
copy_int(&dest,&src);//忽略返回值别名&dest
}
void调用方(void){
int dest;
int src=42;
int*dest\u addr=copy\int(&dest,&src);//dest\u addr别名和dest
}
void调用方(void){
int dest;
int src=42;
int*dest_addr=&dest;
int*dest_addr_2=copy_int(&dest,&src);//dest_addr_2别名dest_addr
}
或者我可以安全地假设
restrict
仅适用于被调用方内部,并且我可以在函数调用外部别名这些指针吗?restrict
适用于函数可以假设的内部copy_int(int*restrict dest,int const*restrict src)
,从而产生更好的优化代码。调用方必须传递不与数据重叠的地址
所有案例在这方面都做相同的事情:copy\u int(&dest,&src)代码>dest
和src
彼此没有别名。OP显示的混叠情况不影响dest、src
下面是错误代码的示例
copy_int(&src, &src); // bad
FWIW,restrict
的正式定义见C标准第6.7.3.1节。另一个有趣的地方是,您的copy\u int
函数具有类似的签名,并且返回行为(返回目标指针)与标准库函数memcpy
相同。我从来没有听说过对memcpy
@user3386109返回值的使用有任何限制是的,它是相似的。既然如此,为什么memcpy
的参数没有限制限定符呢?文件规定,存储区域不得重叠,这是更严格的要求。C11规范第7.24.2.1节中memcpy
的签名为void*memcpy(void*restrict s1,const void*restrict s2,size_t n)代码>也就是说它的参数上有限制限定符。你说得对,我刚刚检查了标准。奇怪的是,我电脑的手册页不准确。也许是因为它在C99之前都不合格?