带有多个只读文本字符串的c-restrict关键字



restrict关键字可以像下面的一样使用吗

  • 接口:

    int func(const char * restrict str1, const char * restrict str2);
    
  • 呼叫:

    func("something", "something");
    

编译器可能会为字符串文字"something"制作相同的指针,以优化封装。在这种情况下,str1str2将指向相同的区域。

这合法吗?

好吧,在我的猜测中,这是可以的,因为例如在这个定义中:

extern int printf (const char *__restrict __format, ...);

它可以像一样使用吗

printf("%s something", "something");

在这种情况下,"something"可以存储在内存中的同一位置,以优化占用空间。

然而,我必须确保它是安全和合法的,因为我想保持我的源代码的便携性和合法性。

如果有人知道一些定义,请教我。


添加(20180804 16:07 JST(:

我想遵守标准。如果标准规定限制指针不能指向相同的地址,

调用函数的情况如:

func("something", "something"); can be illegal.

因为编译器可能对"某物"使用相同的指针。

非法意味着这种代码行为是未定义的,任何事情都可能发生。

所以,简单地说,我可以避免使用"限制"。

但我想用它来制作快速程序。预计如下:

read-only member with keyword "restrict" can be stored in duplicative area.

因为,我看到了printf((的接口。若常量字符串不能指向相同的地址,printf将无效。

int func(const char * restrict str1, const char * restrict str2);就是一个奇怪的例子。

在不引用C规范的情况下(在restrict的情况下,这不容易破译(,restrict意味着所指向的数据只会由于func()或其调用的子函数通过指针所做的事情而改变。


在这种情况下,str1和str2将指向相同的区域

这合法吗?

假设str1str2指向同一位置,并且func(g_temp, g_temp);调用不合法

char g_temp[100] = "Hello world";
int func(const char * restrict str1, const char * restrict str2) {
g_temp[0]++;
puts(str1);
}
void foo() {
func(g_temp, g_temp);
}

func("something", "something");的情况下,可以,因为str1, str2所指向的数据虽然可能重叠,但不会因func()而改变。

这并不是重叠的问题,而是func1()是否可以依赖restrict str1所指向的数据,只是由于访问str1而发生变化。由于str1指向const数据,func1()不会直接更改它,g_temp[0]++;也不会,因为"something"不涉及g_temp[]

最新更新