关闭。这个问题需要details or clarity .它目前不接受答案。
想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题.
8年前关闭。
Improve this question
根据我从编译器编写者那里收集到的信息,在效率方面,值类型比引用/指针更受欢迎。
这是因为当您不必关心别名、外部更改的内存(指针所指的)、指针取消引用的成本等等时,值类型更容易推理。我不得不说,虽然我理解这些担忧,但我对具体案例仍有一些疑问。
案例 #0 void foo(const float& f)
好的,我们这里有一个引用,但它是不变的!当然,我们对它有一个恒定的 View (ref),所以从外部来看它可能会发生变化,但它只能发生在多线程世界中,如果没有使用同步原语,我不确定编译器是否必须考虑它。显然,如果我们在内部使用另一个指向任何浮点变量的指针/引用,我们可能会面临修改 f
的风险。范围。编译器可以将此参数视为安全的吗(假设我们不使用任何 ref/ptr 来在内部 float )?
案例#1 void foo(vector<int> f)
从 C++11/14 程序员的角度来说,我知道 vector
可以安全地移动到函数中。众所周知,容器内部持有一个指向数组的指针。编译器是否会将指针视为安全的(没有外部修改),因为我们刚刚获得了 vector 的拷贝,因此我们是它的唯一所有者?
换句话说:被复制的对象是否被视为安全对象(因为从逻辑上讲我们对对象进行了克隆),或者编译器不允许做出这样的假设和任何 ptr/ref 成员必须被视为具有潜在危险,因为复制 ctor/op 可能没有制作正确的拷贝。程序员在复制共享资源时不应该负责处理共享资源吗?
底线 :
常量指针/引用和复制的复杂对象通常比原语的拷贝慢,因此在性能关键代码中应尽可能避免;或者它们只是效率稍低,我们不应该为此烦恼?
最佳答案
作为现代 C++ 的一般规则:
int
, float
或 double
等,如果是 输入 (只读)参数,只是 按值传递 :inline double Square(double x)
{
return x*x;
}
std::vector
, std::string
等,考虑两个子情况:一种。如果函数只是观察值,则 路过
const
引用 (这将防止无用的潜在昂贵的深拷贝):double Average(const std::vector<double> & v)
{
.... // compute average of elements in v (which is read-only)
}
湾如果函数正在获取参数的本地拷贝,则 按值传递,和
std::move
从值 (由于移动语义,这将允许优化):void Person::SetName(std::string name)
{
m_name = std::move(name);
}
关于C++ 参数类型和效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17988406/