gpt4 book ai didi

c - 访问数组中的项目与指针引用的性能差异?

转载 作者:行者123 更新时间:2023-12-02 07:42:28 25 4
gpt4 key购买 nike

我刚接触 C - 习惯于编写脚本语言,如 PHP、JS、Ruby 等。有一个关于性能的查询。我知道不应该过早进行微优化——但是,我正在为 Google SketchUp 编写一个 Ruby C 扩展,我在其中进行大量 3D 计算,因此性能是一个问题。 (这道题也是为了学习 C 的工作原理。)

通常会进行多次迭代来处理所有 3D 数据,因此我正在尝试找出可能更快的方法。

我想知道如果我对那个数组条目进行指针引用,那么多次访问一个数组条目是否会更快?通常的做法是什么?

struct FooBar arr[10];
int i;
for ( i = 0; i < 10; i++ ) {
arr[i].foo = 10;
arr[i].bar = 20;
arr[i].biz = 30;
arr[i].baz = 40;
}

这会更快还是更慢?为什么?

struct FooBar arr[10], *item;
int i;
for ( i = 0; i < 10; i++ ) {
item = &arr[i];
item->foo = 10;
item->bar = 20;
item->biz = 30;
item->baz = 40;
}

我环顾四周,发现了关于变量与指针的讨论——人们普遍认为指针需要额外的步骤,因为它必须先查找地址,然后再查找值——但总的来说,没有一点影响。

但我想知道的是,访问 C 中的数组条目是否会对性能造成很大影响?在 Ruby 中,如果您需要多次访问条目,则引用该条目会更快 - 但那是 Ruby...

最佳答案

不太可能有显着差异。发出的代码可能是相同的。这是假设一个模糊的能力编译器,启用了优化。您可能想查看反汇编代码,只是为了了解 C 优化器所做的一些事情。您可能会得出这样的结论:“我的代码被破坏得面目全非,现阶段没有必要担心这种事情”,这是一种很好的直觉。

可以想象,如果引入 item 指针以某种方式干扰任何循环展开或编译器在第一个执行的其他优化,那么第一个代码甚至可以更快。也可能是优化器可以计算出 arr[i].foo 等于 stack_pointer + sizeof(FooBar) * i,但无法计算出一次您使用指针,最终使用额外的寄存器,溢出其他东西,影响性能。但我在这一点上疯狂地猜测:通过指针或通过索引访问数组之间通常几乎没有区别,我的观点只是,任何差异都可能出于令人惊讶的原因。

关于c - 访问数组中的项目与指针引用的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666880/

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