- 论坛徽章:
- 2
|
回复 135# pmerofc
关于restrict。举个也许没什么实际意义的例子:
- void fill(int* xs, int const* len, int x)
- {
- int i;
- for (i=0; i<*len; ++i)
- xs[i] = x;
- }
复制代码 i<*len,每次循环都会重新获取*len,因为xs[ i ] = x也许会修改*len。
如果加上restrict:
- void fill(int* restrict xs, int const* restrict len, int x) { 其他代码不变 }
复制代码 编译器就可以假设xs[ i ] = x 不会修改len。 i<*len中的*len就只会读取一次。
但实际上,xs与len是否确实是同一个对象?编译器是没法检查的。
- typedef struct {
- int len;
- int* xs;
- } vector;
- vector v;
- v.len = 12;
- v.xs = (int*)malloc(12*sizeof(int));
- fill(v.xs,&v.len,12);
复制代码 就是不同对象。
而如果只用一个一维数组表示vector,用0元素当作len,其他元素当作xs,就违反了:
- int* vector = (int*)malloc((1+12)*sizeof(int));
- vector[0] = 12;
- fill(vector+1,vector,12);
复制代码 但不会出错。
这是否有用实现解释语言的嫌疑?
就算是有吧…… 与memory.h, p[-1]/p[N+1] 等不同, 它们违反了, 而且能够设想出出错的例子, 即使这种设想暂时没找到。
而其他几种,我前面说的,一脚踩在C的钢丝上,另一脚悬空的情况, 它们也违反了, 但想不出出错的可能性(在不违反C的精神的情况下)……
而关于memory buffer彻底没看明白……
|
|