int fkt(int& i) { 返回i ++; }
int main()
{
int i = 5;
printf("%d ", fkt(i));
printf("%d ", fkt(i));
printf("%d ", fkt(i));
}
打印'5 6 7'。假设我想像这样打印'5 7 9',是否有可能以类似的方式在fkt()中没有临时变量? (一个临时变量会略微降低效率,对吗?)即,像
return i+=2
或
return i, i+=2;
首先增加i然后返回它,这不是我需要的。
由于
编辑:主要原因,我在函数中而不是在外部执行它是因为fkt将是函数指针。原来的功能会对我做一些其他的事情。我只觉得使用{int temp = i; I + = 2; return temp;}看起来不像{return i ++;}。
我不关心printf,这只是为了说明结果的使用。
EDIT2:哇,这似乎是一个比传统板更多的聊天:)谢谢你的所有答案。我的fkt实际上就是这个。根据某些条件,我将get_it定义为get_it_1,get_it_2或get_it_4:
unsigned int (*get_it)(char*&);
unsigned int get_it_1(char* &s)
{return *((unsigned char*) s++);}
unsigned int get_it_2(char* &s)
{unsigned int tmp = *((unsigned short int*) s); s += 2; return tmp;}
unsigned int get_it_4(char* &s)
{unsigned int tmp = *((unsigned int*) s); s += 4; return tmp;}
对于get_it_1,它非常简单......我将在未来尝试提供更多背景......
答案 0 :(得分:28)
“临时变量会略微降低效率,对吧?”
错误。
你测量过吗?请注意,++
仅对PDP-11具有神奇的效率。在大多数其他处理器上,它与+=1
相同。请测量两者,看看实际的差异是什么。
答案 1 :(得分:18)
(临时变量会略微降低效率,对吗?)
如果这是你问的主要原因,那么你太早就要担心了。在遇到实际性能问题之前,不要再猜测编译器。
如果你想让fkt能够为i添加不同的金额,那么你需要传递一个参数。没有任何理由可以选择++
而不是+=
。
答案 2 :(得分:9)
你可以增加两次,然后减去,例如:
return (i += 2) - 2
回答这个问题,我认为你不应该害怕使用临时变量。
答案 3 :(得分:4)
如果您确实需要该速度,请检查编译器输出的汇编代码。如果你这样做:
int t = i;
i+=2;
return t;
然后编译器可以优化它,同时将函数内联到:
printf("%d ", i);
i+=2;
这是最好的。
编辑:现在你说你是通过函数指针跳转到这个函数的吗?与使用临时变量相比,通过指针调用函数非常慢。我不确定,但我想我记得英特尔文档说它在核心2和i7上大约有20到30个cpu周期,也就是说你的功能代码都在缓存中。由于编译器在指针调用时无法内联函数,因此++也会创建一个临时变量。答案 4 :(得分:3)
临时变量略有增加 降低效率,对吧?
始终考虑到“过早优化是万恶之源”。花时间在其他部分,然后尝试优化它。 + =和++可能会导致同样的事情。您的电脑将管理;)
答案 5 :(得分:3)
嗯,你可以做到
return i+=2, i-2;
那就是说,只要遵循这个简单的格言:
编写易于理解的代码。
人们易于理解的代码通常很容易让编译器理解,因此编译器可以对其进行优化。
为了优化代码而编写疯狂的东西通常只会让编译器感到困惑,并使编译器更难以优化代码。
我会推荐
int fkt(int &i)
{
int orig = i;
i += 2;
return orig;
}
答案 6 :(得分:2)
“临时变量”不太可能降低性能,因为i ++必须在内部保持旧状态(即它隐式使用你所谓的temprorary变量)。但是,增加2所需的指令可能比用于++的指令要慢。
您可以尝试:
int fkt(int &i)
{
++ii;
return i++;
}
您可以将其与以下内容进行比较:
int fkt(int &i)
{
int t = i;
i += 2;
return t;
}
那就是说,我认为你不应该过早地做任何这样的性能考虑。
答案 7 :(得分:1)
我认为你真正想要的是一个仿函数:
class Fkt
{
int num;
public:
Fkt(int i) :num(i-2) {}
operator()() { num+=2; return num; }
}
int main()
{
Fkt fkt(5);
printf("%d ", fkt());
printf("%d ", fkt());
printf("%d ", fkt());
}
答案 8 :(得分:-1)
怎么样?
int a = 0;
++++a;
增加+2没有临时变量。
编辑: 哎呀,对不起:没注意到你要达到5,7,9。这需要临时变量,因此不能使用前缀表示法。