我有一个自定义 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()
开销很小,并且绝对不会占用我计算时间的最大部分。谁能指出我在这里做错的正确方向?