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

C 'restrict' keyword based optimisation

有以下结构:

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:当我仅在本地使用 object 时,我是否还应该使用 test_t * restrict object 而不是仅 test_t * object 来增加优化?

  1. 你已经告诉编译器 object->def 没有改变,所以它可以假设信息没有被调用 do_something() 改变,所以它可以避免在每个循环的每次迭代中重新加载循环限制。但是,它没有义务进行这样的优化。您必须查看生成的汇编程序才能知道它是否进行了优化。

  2. 使用restrict对此没有任何影响。

  3. N/A — restrict 只是表示没有其他指针指向该对象。