以下方法是否尊重“限制”合同?
void fun(int* restrict foo) {
int* bar = foo + 32;
for (int i = 0; i < 32; ++i)
*bar = 0;
}
我的猜测是否定的,但我需要澄清一下。
以下方法是否尊重“限制”合同?
void fun(int* restrict foo) {
int* bar = foo + 32;
for (int i = 0; i < 32; ++i)
*bar = 0;
}
我的猜测是否定的,但我需要澄清一下。
是的,它确实尊重合同。
6.7.3 类型限定符
8 通过
restrict
限定指针访问的对象与该指针具有特殊关联。这种关联,在下面的 6.7.3.1 中定义,要求对该对象的所有访问直接或间接使用该特定指针的值。135)限制限定符的预期用途(如寄存器存储类)是为了促进优化,并且从构成符合程序的所有预处理翻译单元中删除限定符的所有实例不会改变其含义(即,可观察的行为)。
简而言之,在点foo
被定义(函数调用)时,程序员保证它foo
是引用它所指向的对象(如果有的话)的唯一方法。
因此,引用这些对象的所有其他表达式必须从该指针值派生(如设置为)。
在这种情况下,背信弃义会受到未定义行为的应有惩罚。bar
foo+32