【发布时间】:2012-06-08 01:21:46
【问题描述】:
typedef struct {
void * field1;
} s1;
void func1(void) {
s1 my_s1;
s1 * __restrict my_s1_ptr = &my_s1;
*((int*)((char*)my_s1_ptr->field1 + 4)) = 0;
*((int*)((char*)my_s1_ptr->field1 + 8)) = 1;
*((int*)((char*)my_s1_ptr->field1 + 12)) = 2;
*((int*)((char*)my_s1_ptr->field1 + 16)) = 3;
}
似乎对于 Intel 编译器 11.1 版和 gcc 4.6 版,编译器会为最后 4 个语句中的每一个重新加载 my_s1_ptr->field1。我对 __restrict 的理解会告诉我最后 3 个负载应该是多余的并且可以被消除。是的,我知道代码很奇怪,但它的结构是这样的。我只是希望能够让编译器消除冗余负载。知道如何说服它这样做吗?
【问题讨论】:
-
你编译优化了吗?为什么你使用
__restrict而不是restrict,这是一个C99关键字? -
我确实进行了优化编译,__restrict 与 restrict 没有区别。
-
我只是在指向字段的指针而不是指向结构的指针上尝试了几种变体,它没有改变任何东西。在实际代码中,可能有多个指针指向 field1 指向的内容,因此将限制添加到 field1 是无效的(但即使我尝试过它也没有消除负载)。如果我将 field1 复制到一个限制局部变量指针,那么冗余负载将被消除,但就像我说的那样,这违反了程序的语义。
-
AFAIK,
restrict并不总是优化。它“可能允许编译器”执行优化。编译器不需要执行这些优化。无论如何,我觉得很奇怪,你的情况不是这样。 -
你的例子正确吗?当你取消引用它时,field1 没有指向任何东西......其次,由于 my_s1_ptr->field1 不受限制,它重新加载该指针不是正常的,还是你的意思是它重新加载 my_s1_ptr?
标签: c optimization compiler-construction c99 restrict-qualifier