基于C'restrict'关键字的优化

时间:2018-06-20 15:58:11

标签: c restrict

有以下结构:

typedef struct test_def {
  int a, b, c;
} test_def_t;

typedef struct test {
  test_def_t const * const def;
} test_t;

我想这样使用它们:

test_def_t initial_def;
test_t * object;

initial_def.a = 123;
initial_def.b = 456;
initial_def.c = 789;

init_object(&object, &initial_def);

现在,object->def是指向initial_def副本的指针。

稍后,我将使用通常从object->def获取值的代码。我知道这个object->def是只读的,永远不会改变。

示例:

for(int a = 0; a < object->def->a; ++a)
  for(int b = 0; b < object->def->b; ++b)
    for(int c = 0; c < object->def->c; ++c)
      do_something(object);

问题#1 :即使可以一次加载,编译器是否也会加载object->def->a,其余是否每次迭代都加载?

问题2 :是否像下面那样使用restrict会改变这种行为?

typedef struct test {
  test_def const * const restrict def;
                      /* ^^^^^^^^ */
} test_t;

问题3 :当我仅在本地使用test_t * restrict object时,是否还应该使用test_t * object而不是仅仅使用object来提高优化程度?

1 个答案:

答案 0 :(得分:1)

  1. 您已经告诉编译器object->def不变,因此可以假设通过调用do_something()信息没有改变,因此可以避免重新加载循环每个循环的每次迭代的限制。但是,没有必要进行这种优化。您必须查看生成的汇编程序,以了解它是否进行了优化。

  2. 使用restrict对此毫无影响。

  3. 不适用-restrict仅表示没有其他指向该对象的指针。