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

时间:2016-01-11 00:44:13

标签: c++

我有一个奇怪的问题:

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会更快(让我们说"类"是int)?

1 个答案:

答案 0 :(得分:0)

对于int,它在速度方面不会有太大差异。虽然编译器可以在某些情况下进行一些额外的优化 - 例如,当使用const时。

如果对象较大,并且/或者需要调用它们的复制构造函数,那将很重要。

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

  

在for循环中声明迭代器是否较慢,例如:for   (int i = 0; ...)(假设我们有一堆可以使用的循环   同一个范围内的同一个迭代器),或者声明它更好   在外部范围内,作为变量,如int i; for(i = 0; ...   );?我的逻辑是,如果我们可以的话,在外面宣布它会更快   重复使用它,但我无法完全确定

一般规则是尽可能晚地声明变量(即尽可能接近您需要的变量)。但同样,编译器可以非常智能,并且在大多数情况下会优化它。

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

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