调用具有受限制参数的函数,这些参数在当前作用域中已经受到限制

山区议员

我很难理解restrict用已受限制的变量调用函数意味着什么

维基百科告诉我:

strict关键字是程序员向编译器给出的意图声明。它表示在指针的整个生命周期内,将仅使用它或直接从其派生的值(例如指针+ 1)来访问它所指向的对象。

我有以下三个示例函数:

void a(int const *p1, int const *p2) {
    ...
}

void b(int *restrict p1, int *restrict p2) {
    ...
}

void c(int *p1, int *p2) {
    ...
}

我会从函数中分别调用它们

foo(int *restrict p1, int *restrict p2) {
    a(p1, p2);
    b(p1, p2);
    c(p1, p1+1);
}

他们中的哪一个会信守restrict函数foo声明承诺

这三种情况是:

  1. 函数a不做任何修改,因此肯定会成立。

  2. 怎么样b,它的参数是从foo的指针“直接派生”的?foo如果修改p1p2我是否会放弃在声明中给出的诺言b

  3. c如果不以任何方式限制参数,情况是否会从上一场景发生变化,例如,我在中编辑p2 c

迪特里希·埃普

这是您的承诺:

void foo(int *restrict p1, int *restrict p2) {
    // a() can't modify p1[...] or p2[...]
    a(p1, p2);
    // b() CAN modify p1[...] or p2[...]
    // Note that you are still making this promise if you don't use
    // "restrict" in the declaration of b()
    b(p1, p2);
    // c() CAN modify p1[...] but not p2[...]
    c(p1, p1+1);
}

您不能确定所作出的承诺是正确的,除非您知道函数的作用以及如何调用它们。

例如,这是错误的:

int global;
void a(int const *p1, int const *p2) {
    // Since p1 == &global, we can break the promise here
    // by accessing *p1 through the name "global"...
    // Even though this function is perfectly okay by itself!
    global = 5;
}
void foo(int *restrict p1, int *restrict p2) {
    // We have a promise that a() won't modify p1[...]
    // BECAUSE: "restrict" promises that all p1 modifications
    // go through p1, since p1 is passed "const" a() is not
    // supposed to modify *p1, but p1 = &global, and a() modifies
    // global... BOOM!
    // Even though this function is perfectly okay by itself...
    a(p1, p2);
}
int main() {
    int y;
    // Illegal!  Once you pass &global to foo(), BOOM!
    foo(&global, &y);
}

这就是为什么restrict有些棘手的原因。仅凭功能签名就无法确定它是否正确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“调用方”和“参数”是受限制的函数属性,在这种情况下无法访问

Java通用方法不起作用-参数不受限制

泛型类型参数受到限制,而没有传递实型

参数受限制的重载函数或在其他地方找到方法

等待函数以循环进行受限制的API调用

函数声明以及它们如何在当前作用域中创建变量

通过使用具有有限可变参数(std :: is_same)的模板函数来限制允许的COM接口

同步Lambda调用-受到限制时会发生什么?

调用具有不同数量参数的函数

从JavaScript中的对象调用具有正确参数的函数

Haskell使用map调用具有多个参数的函数

在Python中调用具有参考参数的.Net函数

调用具有较少参数的C函数?

使用反射调用具有默认参数值的函数

在 Sinon 中假调用具有特定参数的函数

调用具有多个参数值的模板函数

调用具有多个数组参数的函数

打字稿:调用具有“this”参数的静态函数

如何调用具有不同类作为参数的函数

Python不带参数的“引发”:什么是“当前作用域中活动的最后一个异常”?

活动不受限制

具有rest参数的函数调用具有rest参数的函数

在运行时构建具有不受限制的RAM使用的jar

如何以编程方式查找具有不受限制的 SSH 连接的 VM?

JAXB-在xsd:all内部具有不受限制的maxOccur的元素

如何使用具有参数化返回类型的函数参数调用函数

调用具有通用参数的方法

如何通过更改引用传递的参数来对调用具有副作用的函数的方法进行单元测试?

Stripe API帐户受到限制