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
来增加优化?
你已经告诉编译器 object->def
没有改变,所以它可以假设信息没有被调用 do_something()
改变,所以它可以避免在每个循环的每次迭代中重新加载循环限制。但是,它没有义务进行这样的优化。您必须查看生成的汇编程序才能知道它是否进行了优化。
使用restrict
对此没有任何影响。
N/A — 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:当我仅在本地使用 object
时,我是否还应该使用 test_t * restrict object
而不是仅 test_t * object
来增加优化?
你已经告诉编译器
object->def
没有改变,所以它可以假设信息没有被调用do_something()
改变,所以它可以避免在每个循环的每次迭代中重新加载循环限制。但是,它没有义务进行这样的优化。您必须查看生成的汇编程序才能知道它是否进行了优化。使用
restrict
对此没有任何影响。N/A —
restrict
只是表示没有其他指针指向该对象。