可以像下面一样使用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"
可以存储在内存中的同一位置以优化占用空间。
但是,我必须确保它的安全性和合法性,因为我想保持源代码的可移植性和合法性。
如果有人知道一些定义,请教我。
添加(JST 20180804 16:07):
我要遵守标准。 如果标准说限制指针不能指向相同的地址,
像下面这样调用函数
func("something", "something"); can be illegal.
因为编译器可能对“某物”使用相同的指针。
并且非法意味着此代码行为是不确定的,任何事情都可能发生。
因此,以简便的方式,我可以避免使用“限制”。
但是我想用它来制作快速程序。 预计会这样:
read-only member with keyword "restrict" can be stored in duplicative area.
因为,我看到了printf()的界面。 如果const字符串不能指向相同的地址,则printf将无用。
答案 0 :(得分:1)
int func(const char * restrict str1, const char * restrict str2);
是一个很好的例子。
如果不引用C规范,对于restrict
来说,它就不容易解密,restrict
意味着指向的数据只会因func()
或其内容而改变。所谓的子功能通过 that 指针完成。
在这种情况下,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[]
。