gpt4 book ai didi

c - 关于C9 9's array size "保证”功能参数中的特性的实际优势?

转载 作者:行者123 更新时间:2023-12-03 19:09:00 25 4
gpt4 key购买 nike

C99 引入了一种新的函数参数表示法,其中 static关键字可用于指定参数至少有 N 个元素。
6.7.6.3 Function declarators, p7

A declaration of a parameter as ''array of type'' shall be adjusted to''qualified pointer to type'', where the type qualifiers (if any) arethose specified within the [ and ] of the array type derivation. Ifthe keyword static also appears within the [ and ] of the array typederivation, then for each call to the function, the value of thecorresponding actual argument shall provide access to the firstelement of an array with at least as many elements as specified by thesize expression.


例如。
void func(int x[static 10])
{
/* something */
}
表示 x 至少有 10 个元素。但这不是约束,因此编译器不需要发出诊断。
C99 rationale关于这一点:

[..] It would be a significant advantage on some systems for thetranslator to initiate, at the beginning of the function, prefetchesor loads of the arrays that will be referenced through the parameters.There is no way in C89 for the user to provide information to thetranslator about how many elements are guaranteed to be available.

In C99, the use of the static keyword in:

void fadd(double a[static 10], const double b[static 10]) {
int i;
for (i = 0; i < 10; i++) {
if (a[i] < 0.0)
return;
a[i] += b[i];
}
return;
}

guarantees that both the pointers a and b provide access to the firstelement of an array containing at least ten elements. The statickeyword also guarantees that the pointer is not NULL and points to anobject of the appropriate effective type.


理由似乎表明比 C 标准中声明的更有保证。
基于这些事实:
  • 是否有任何实际系统可以提供基本原理中所述的“显着优势”?
  • 为什么 C 标准没有做出这样的保证(如在 C99 基本原理中),这可能首先促使引入此功能?

  • (显然,更好的编译时诊断可能是一种用途 - 但这既不是“显着优势”,也无助于预期的优化。此外,编译器
    如果他们在没有像这样的正式功能的情况下推断出潜在的空指针取消引用,则总是可以发出诊断信息)。

    最佳答案

    我并不完全理解你的问题,但我认为你可能对这里缺少“约束”意味着什么感到困惑。这不是约束,并且编译器没有义务发出诊断信息,因为编译器不一定能够在调用它时看到函数的定义。 static数组大小保证是函数定义的属性,而不是函数类型/声明。对此有多种可能的原因,最有可能的原因是希望不使用/不使用不兼容的函数类型进行声明。
    不幸的是,这限制了该功能仅用于优化,而不是正确性检查,除非编译器(或链接器)可以看到不匹配的情况。该功能的“优点”是编译器可以进行优化以读取在抽象机器上无法读取的索引。例如,在:

    int foo(int a, int b[static 1])
    {
    if (!a) return 0;
    else return a & *b;
    }
    可以优化分支。

    关于c - 关于C9 9's array size "保证”功能参数中的特性的实际优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62843710/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com