gpt4 book ai didi

c - 当存在重新分配内存(更改指针)的可能性时,使用 "restrict"是否有效?

转载 作者:行者123 更新时间:2023-12-04 12:21:45 26 4
gpt4 key购买 nike

我正在尝试对代码进行一些优化,但很难确定“限制”在这种情况下是否有用或是否会导致问题。
我有一个函数,它传递了两个字符串 (char*) 以及一个 int (int*)。
第二个字符串在第一个字符串之后复制到内存中,位置由 int 指示。如果这会超出第一个字符串的内存分配,则必须在执行此操作之前为第一个字符串重新分配内存。使用新分配创建一个新指针,然后将原始第一个字符串指针设置为等于它。

char* concatFunc (char* restrict first_string, char* const restrict second_string, int* const restrict offset) {
size_t block = 200000;
size_t len = strlen(second_string);
char* result = first_string;

if(*offset+len+1>block){
result = realloc(result,2*block);
}
memcpy(result+*offset,second_string,len+1);
*offset+=len;
return result;
}
上述函数被其他同样使用restrict关键字的函数重复调用。
char* addStatement(char* restrict string_being_built, ..., int* const restrict offset){
char new_statement[30] = "example additional text";

string_being_built = concatFunc(string_being_built,&new_statement,offset);
}
所以在 concatFunc 中 first_string 受到限制(意味着指向的内存不会从其他任何地方改变)。但是,如果我重新分配一个指针,该指针是该指针的副本,是否会导致未定义的行为,或者编译器是否足够聪明以适应这种情况?
基本上:当您限制指针参数但随后更改指针时会发生什么。

最佳答案

What happens when you restrict a pointer parameter, but then change the pointer.


这取决于指针是如何改变的——在这种情况下, memcpy()风险 UB。
char* result = first_string; ,继承了 restrictchar* restrict first_string .
result = realloc(result,2*block); , result和以前一样,通过 result 访问不会与通过 second_string 访问发生冲突或 offset result是新内存并通过 result 访问不会与通过 second_string 访问发生冲突或 offset .
然而编译器能知道新分配的 result吗?具有 realloc() 的上述两个属性之一?毕竟 realloc()可能是用户定义的函数,编译器不应假设 result现在有 restrict属性(property)了。
因此 memcpy()处于危险之中。

is the compiler smart enough to accommodate that?


我不认为它可以,除了警告 memcpy()用法。
当然OP可以使用 memmove()而不是 memcpy()以避免担心。

在我看来,一个简化的例子是:
char* concatFunc (char* restrict first_string, char* restrict second_string) {
int block = rand();

first_string = foo(first_string, block);

// first_string at this point may equal second_string,
// breaking the memcpy() contract

memcpy(first_string, second_string, block);
return first_string;
}
或者更简单
char* concatFunc (char* /* no restrict */ first_string, char* restrict second_string) {
return memcpy(first_string, second_string, 2);
}

关于c - 当存在重新分配内存(更改指针)的可能性时,使用 "restrict"是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68763895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com