C++ 参数类型和效率

标签 c++ c++11

关闭。这个问题需要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 , floatdouble等,如果是 输入 (只读)参数,只是 按值传递 :
    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/

    相关文章:

    c++ - 控制线程异步执行时间

    c++ - Qt4 到 Qt5 链接错误

    c++ - 针对 "Find the first repeated character in a string"挑战的最紧凑、高效、可读和聪明的解决方案

    c++ - C/C++ - 预编译 header - 封装、如何以及为什么需要配置?

    java - 创建占用特定数量 CPU 和 RAM 的任务

    c++ - lambda 函数返回值的有效性

    c++ - 如何轻松更改 BOOST_LOG_TRIVIAL 的输出

    multithreading - 使用C++ 0x线程库退出时崩溃

    C++11:类中的 std::thread 在构造函数中执行具有线程初始化的函数成员

    c++ - 如何遍历 std::index_sequence