5

我有一个自定义 ringbuffer 实现,它使用通过分配的普通数组new [],然后用于std::move将元素移动到数组中。这是我的push()方法的实现:

void push(value_type&& value)
{
    _content[_end] = std::move(value); // 9.2% of execution is spend here
    increment(); // 0.6% here
}

我要移入数组的对象基本上只是一个指针和一个std::unique_ptr

struct Task
{
    Task()
    {}

    Function function;
    Batch *batch;
};

Function看起来像这样:

class Function
{
public:
    template<typename F>
    Function(F&& f) :
        _implementation(new ImplementationType<F>(std::move(f)))
    {}

    void operator() () { _implementation->Call(); }

    Function() = default;
    Function(Function&& other) :
        _implementation(std::move(other._implementation))
    {}

    Function& operator=(Function&& other)
    {
        _implementation = std::move(other._implementation);
        return *this;
    }

    Function(const Function&) = delete;
    Function(Function&) = delete;
    Function& operator= (const Function&) = delete;

private:
    struct Base
    {
        virtual void Call() = 0;
        virtual ~Base() {}
    };

    template<typename F>
    struct ImplementationType : Base
    {
        ImplementationType(F&& f) :
            function(std::move(f))
        {}

        void Call()
        {
            function();
        }

        F function;
    };

    std::unique_ptr<Base> _implementation;
};

我在循环中重复调用 ringbufferspush()方法以用任务填充缓冲区,那里没有其他计算发生。我希望它的std::move()开销很小,并且绝对不会占用我计算时间的最大部分。谁能指出我在这里做错的正确方向?

4

1 回答 1

12

std::move本身在运行时什么也不做;它只是将其参数转换为适合传递给移动赋值运算符的右值。这是一项需要时间的任务。

如果_content[_end]不为空,则重新分配唯一指针将删除旧对象。也许这就是花时间的原因?

于 2013-10-21T17:00:42.937 回答