有以下结构:
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
来提高优化程度?
答案 0 :(得分:1)
您已经告诉编译器object->def
不变,因此可以假设通过调用do_something()
信息没有改变,因此可以避免重新加载循环每个循环的每次迭代的限制。但是,没有必要进行这种优化。您必须查看生成的汇编程序,以了解它是否进行了优化。
使用restrict
对此毫无影响。
不适用-restrict
仅表示没有其他指向该对象的指针。