使用多个只读文字字符串限制关键字

时间:2018-08-04 03:03:12

标签: 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"可以存储在内存中的同一位置以优化占用空间。

但是,我必须确保它的安全性和合法性,因为我想保持源代码的可移植性和合法性。

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


添加(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将无用。

1 个答案:

答案 0 :(得分:1)

int func(const char * restrict str1, const char * restrict str2);是一个很好的例子。

如果不引用C规范,对于restrict来说,它就不容易解密,restrict意味着指向的数据只会因func()或其内容而改变。所谓的子功能通过 that 指针完成。


  

在这种情况下,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[]