gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:16:34 27 4
gpt4 key购买 nike

有以下结构:

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 只在本地?

最佳答案

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

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

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

关于C 'restrict' 基于关键字的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952466/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com