为什么printf中的格式标记为restrict?

Aja*_*iya 7 c printf restrict

我刚碰巧看了printf(和其他fprintf类函数)的原型-

int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)

restrict如果我理解正确的关键字,如果标记了其中一个,则禁止通过两个指针访问同一个对象restrict.

这里引用了与C标准相同的例子.

restrict我认为标记格式的一个好处是保存函数,使其不会在执行期间修改格式字符串(比如因为%n格式说明符).

但这是否会产生更大的约束?这会使以下函数调用无效吗?

char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)

因为这里有明显的别名.为什么将restrict关键字添加到format参数中printf

Hol*_*Cat 7

cppreference

期间在该受限制的指针的块的每个执行P被声明(通常是功能体,其中的每一次执行P是一个函数参数),如果一些对象,它是通过可访问的P(直接或间接)被修改,以任何方式,则所有对该块P中的对象(包括读取和写入)的访问必须通过(直接或间接)进行,否则行为是未定义的.

(强调我的)

这意味着:

char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)

定义明确,因为printf不会尝试修改format.

唯一restrict未定义的是'使用%…nwhile printf运行时写入格式字符串'(例如char f[] = "%hhn"; printf(f, (signed char *)f);).

为什么restrict关键字被添加到格式参数printf

restrict 本质上是编译器可能用来更好地优化代码的提示.

由于restrict可能会或可能不会使代码运行得更快,但它永远不会让它变慢(假设编译器是理智的),它应该始终使用,除非:

  • 使用它会导致UB
  • 在这种特定情况下,它没有显着的性能提升