1

对不起,如果这是一个愚蠢的问题,我还不太精通计算机科学。这是算法速度的问题。

我遇到了这样的问题我决定解决。我的计划是根据需要增加斐波那契数列以获得准确的结果。

这是我增加的方式;

unsigned int last(1), current(1) ;
unsigned int sum = 0 ;

looping
{
   ...
   current += last ;
   last = current - last ;
}

我觉得这肯定与增量需要的一样好,并且可能与我能想到的一样好,因为我的知识有限。但是有没有一种特殊的方法可以只使用这两个变量来做同样的增量?也许我的想法是错误的,但是这样做会更快吗:

temp = current ;
current += last ;
last = temp ;

视觉上比以前多了一个语句,还有一个额外的变量。他们都做同样的事情,但我觉得一个更快,使用更少的内存。我是对的,哪一个被认为是最有效的?

附带说明一下,我对使用指针不是很有经验,但是我是否正确地假设指针不会发生太大变化,因为考虑到 int 类型的标准,每条数据通常是 4 个字节?我可以理解为什么使用 50 字节的自定义类型可能更好地使用指针,但它对我的第二种算法有帮助吗?

4

2 回答 2

7

不不不。保持你的代码简单明了。像这样明显的优化,当它们实际上是改进时,将由编译器进行。

顺便说一句,使用 GCC,这两个函数产生完全相同的 5 个汇编指令:

    void sum1(int * __restrict last, int * __restrict current)
    {
            int temp = *current;
            *current += *last;
            *last = temp;
    }

    void sum2(int * __restrict last, int * __restrict current)
    {
            *current += *last;
            *last = *current - *last;
    }

所以 GCC 明白它们总是会产生相同的结果,并且可能也会在其他情况下将它们视为等效的。因此,使用更清楚地表达您的意图,更易于理解和维护的任何一个,等等。

于 2012-12-27T09:43:43.770 回答
1

您可以使用std::tuple

unsigned int last(1), current(1);

looping
{
    ...
    //`std::tie` creates a tuple containing references to `last` and `current`
    //`std::make_tuple` creates a tuple containing the new values. 
    std::tie(current, last) = std::make_tuple(current+last, current);
}
于 2012-12-27T12:38:43.203 回答