两个被restrict限定的指针能否相等?为何GCC/Clang未做对应优化?
关于
restrict指针比较的优化疑问 int foo(void *restrict ptr1, void *restrict ptr2) { if (ptr1 == ptr2) { return 1234; } else { return 4321; } }
按照restrict的定义,它表示指针指向的内存区域不会被其他指针别名引用。照此逻辑,ptr1和ptr2不应指向同一内存区域,那么ptr1 == ptr2的比较结果应该恒为假,函数foo()应该始终返回4321。但GCC和Clang并未做此优化,这是遗漏优化还是另有原因?
这不是编译器的优化遗漏,而是对restrict关键字的核心约束理解有误:
restrict的约束目标是指针对内存区域的访问行为,而非指针本身的地址相等性。它保证的是:在指针的有效作用域内,通过该指针对内存的读写操作,不会被其他restrict指针(或未被允许的非restrict指针)干扰——也就是说,不存在两个restrict指针同时作为同一内存区域的“活跃”访问路径。- 当调用者传入两个指向同一地址的
restrict指针时,只要函数内部没有通过这两个指针去访问该内存,这种调用就完全符合C标准的要求。编译器不能假设ptr1 != ptr2,因为这种相等的情况是合法的,且不会违反restrict的约束。
只有当函数内部存在通过ptr1或ptr2访问内存的操作时,编译器才会基于restrict的约束,推断两个指针指向不同的内存区域,进而做消除分支之类的优化。但在当前代码中,仅进行指针值的比较,没有任何内存访问操作,所以编译器无法安全地消除这个分支。
内容的提问来源于stack exchange,提问作者Jacob Faib
相关产品推荐
相关产品推荐

