C++复制和直接函数参数

C++ - copied and direct function parameters

本文关键字:函数 参数 复制 C++      更新时间:2023-10-16

我有一个奇怪的问题:

void _fnc1( const class& _var )  // takes up reference of _var , but cant modify it 
{                                // i'd do this if i need speed.
    // do something with _var...
};
void _fnc2( class _var ) // takes up a copy of _var
{                        // any modification of _var now stays only in the function scope
    // do something with _var...
};

如果我以后做一些类似的事情:

_fnc1( 1 );

_fnc2( 1 );

fnc1还会更快吗(假设"class"是int)?

对于int,速度不会有太大差异。尽管编译器在某些情况下可以进行一些额外的优化,例如在使用const时也是如此。

如果对象更大,和/或需要调用它们的复制构造函数,这将很重要。

在某些情况下,像int的其他内置类型这样的小参数类型可以直接存储在寄存器中。除了一些编译器优化之外,对此类类型使用指针或引用在速度上不会有太大差异(它们占用的空间大致相同)。

在for循环中声明迭代器是否较慢,例如:for(int i=0;…)(假设我们有一堆循环,可以使用相同范围内的相同迭代器),还是最好声明它在外部范围中,作为变量,例如int i;对于(i=0。。。);?我的逻辑是,如果可以的话,在外面声明会更快重复使用它,但我不能完全确定

一般规则是尽可能晚地声明变量(即尽可能靠近需要它们的地方)。但同样,编译器可能非常聪明,并且在大多数情况下都会对其进行优化。

至于你的具体例子:做一个测试总是很有趣的。编译器可能会优化掉大部分差异,甚至可能生成相同的代码(或内联整个函数)。

最好的测试是查看生成的程序集代码。从中可以学到很多东西。