根据我从编译器作者那里收集到的信息,就效率而言,值类型比引用/指针更受欢迎。
这是因为当您不必关心别名、外部更改的内存(指针所指的)、指针取消引用的成本等事情时,值类型更容易推理。我不得不说,虽然我理解这些担忧,但我仍然对具体案例有一些疑问。
案例#0
void foo(const float& f)
好的,我们在这里有一个参考,但它是不变的!当然,我们对它有一个恒定的视图(参考),所以在外部它可能会发生变化,但它只能发生在多线程世界中,如果没有使用同步原语,我不确定编译器是否必须考虑它。显然,如果在内部我们使用另一个指针/引用任何浮点变量,我们可能会面临修改f
参数的风险。编译器可以将此参数视为安全的(假设我们不使用任何 ref/ptr 在内部浮动)吗?
情况1
void foo(vector<int> f)
从 C++11/14 程序员的角度来看,我知道vector
可以安全地将其移入函数中。众所周知,容器内部保存着一个指向数组的指针。编译器是否会将指针视为安全的(没有外部修改),因为我们刚刚获得了向量的副本,所以我们是它的唯一所有者?
换句话说:被复制的对象是否被视为安全对象(因为逻辑上我们会克隆该对象),或者编译器不允许做出这样的假设,并且任何ptr/ref 成员都必须被视为具有潜在危险的复制 ctor/op 可能没有正确复制。复制共享资源时,程序员不应该负责处理它们吗?
底线:
Do 常量指针/引用和复制的复杂对象通常比原语的副本慢,因此在性能关键代码中应尽可能避免;还是它们的效率稍低一些,我们不应该为此烦恼?