restrict
关键字可以像下面的一样使用吗
-
接口:
int func(const char * restrict str1, const char * restrict str2);
-
呼叫:
func("something", "something");
编译器可能会为字符串文字"something"
制作相同的指针,以优化封装。在这种情况下,str1
和str2
将指向相同的区域。
这合法吗?
好吧,在我的猜测中,这是可以的,因为例如在这个定义中:
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将指向相同的区域
这合法吗?
假设str1
和str2
指向同一位置,并且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[]
。