C++ 我是否可以使用I++;语法?
内部fkt(内部和内部) { 返回i++; } 打印“567”。假设我想这样打印“5 7 9”,在fkt()中没有临时变量的情况下,是否可以以类似的方式打印?(一个临时变量会略微降低效率,对吗?)C++ 我是否可以使用I++;语法?,c++,c,C++,C,内部fkt(内部和内部) { 返回i++; } 打印“567”。假设我想这样打印“5 7 9”,在fkt()中没有临时变量的情况下,是否可以以类似的方式打印?(一个临时变量会略微降低效率,对吗?) return i+=2 或 这两者都先增加了我,然后又返回它,这不是我所需要的 谢谢 编辑:主要原因是,我在函数中而不是在函数外部执行此操作,因为fkt将是函数指针。原始函数将对i执行其他操作。我只是觉得使用{int temp=I;I+=2;return temp;}似乎没有{return I++
return i+=2
或
这两者都先增加了我,然后又返回它,这不是我所需要的
谢谢
编辑:主要原因是,我在函数中而不是在函数外部执行此操作,因为fkt将是函数指针。原始函数将对i执行其他操作。我只是觉得使用{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,它是如此简单。。。以后我会尽量提供更多的背景资料
“临时变量会略微降低效率,对吗?”
错
你量过了吗?请注意,++
仅在PDP-11上具有神奇的效率能力。在大多数其他处理器上,它与+=1
完全相同。请测量两者,看看实际的差异是什么
(临时变量会略微降低效率,对吗?)
如果这是你提问的主要原因,那么你担心得太早了。在遇到实际性能问题之前,不要猜测编译器
如果希望fkt能够向i添加不同的量,则需要传递一个参数。没有实质性的理由选择
++
而不是++=
你可以增加两次,然后减去,比如:
return (i += 2) - 2
printf("%d ", i);
i+=2;
不过,仅回答这个问题,我认为您不应该害怕使用临时变量。一个“临时变量”不太可能降低性能,因为I++必须在内部保持旧状态(即,它隐式使用您称之为临时变量的变量)。但是,需要增加2的指令可能比用于++的指令慢
您可以尝试:
int fkt(int &i)
{
++ii;
return i++;
}
您可以将其与以下内容进行比较:
int fkt(int &i)
{
int t = i;
i += 2;
return t;
}
也就是说,我认为您不应该过早地考虑任何此类性能问题。如果您确实需要这样的速度,请检查编译器输出的汇编代码。如果您这样做:
int t = i;
i+=2;
return t;
然后,编译器可以优化它,同时将函数内联到如下内容中:
return (i += 2) - 2
printf("%d ", i);
i+=2;
这是最好的
编辑:现在你说你通过函数指针跳转到此函数?与使用临时变量相比,通过指针调用函数的速度非常慢。我不确定,但我想我记得Intel文档中说,在Core 2s和i7s上大约有20-30个cpu周期,也就是说,如果你的函数代码都在缓存中。由于编译器在被指针调用时无法内联函数,因此++也将创建一个临时变量
一个临时变量可能会稍微
降低效率,对吗
始终考虑“过早优化是万恶之源”。花时间在其他部件上,然后尝试优化此部件和++可能会产生同样的结果。您的电脑将管理;) 好吧,你可以
return i+=2, i-2;
也就是说,只要遵循这条简单的格言:
编写易于理解的代码
人类容易理解的代码通常容易被编译器理解,因此编译器可以对其进行优化
为了优化代码而编写一些疯狂的东西通常只会使编译器感到困惑,使编译器更难优化代码
我推荐
int fkt(int &i)
{
int orig = i;
i += 2;
return orig;
}
我想你真正想要的是一个函子:
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());
}
那怎么办
int a = 0;
++++a;
不带临时变量的增量+2
编辑:
哦,对不起:没有注意到你想要达到5,7,9。这需要临时变量,所以不能使用前缀符号。忽略这些效率考虑因素,使用一个有效的解决方案。我只想确保您意识到printf比I+=2慢数千倍。SadSido是对的……I+=2;返回i;也一样。如果你仔细想想,i++实际上只是一种表示i+=1的便捷方式,这是一种表示i=i+1的便捷方式。(有趣的是,我们程序员想出了方便的方法,使我们的方便方法更加方便)你不会有任何开销,因为汇编指令已经有了一个“addimmediate”选项,可以用整数进行加法。不需要额外的寄存器!首先编写最容易阅读和维护的代码,然后进行度量。如果您通过测量发现性能问题,请首先找到对性能影响最大的领域,然后实施您认为是改进的地方,然后再次测量,以查看您的猜测是否正确。“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。然而,我们不应该在这关键的3%中放弃我们的机会。一个好的程序员不会因为这样的推理而自满,他会明智地仔细查看关键代码;但只有在代码完成后,我才会这样做。”确定的”-Donald Kunth——在PDP-11上,编译器优化是由人类执行的;)好吧,我很好奇-PDP-11有什么魔力意味着I++比I+=1快?某种类似于6502上INX/INY的片上递增指令,编译器知道并优先使用标准ALU加法?PDP11的体系结构(以及此后出现的许多)可以在一条指令中取消引用并递增或递减指针。通常,递增/递减被强制为加载/存储的数据大小(例如,如果加载,则为1)