将受限制的指针指定给另一个指针是否合法,并使用第二个指针修改该值?
以下方法是否尊重“限制”合同?
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
是引用它所指向的对象(如果有的话)的唯一方法。
因此,引用那些对象的所有其他表达式必须从该指针值派生(如设置为foo+32
bar
)。
在这种情况下,打破信仰就会受到不确定行为的严厉惩罚。