Здесь проблема состоит в том, чтобы понять, был ли вызван конструктор копирования или перемещения при инициализации вектора возвращаемым объектом функции. Проверка malloc с помощью профилировщика показывает одинаковые memcopies в обоих случаях. Почему?
У нас есть класс типа «сообщение». Класс предоставляет функцию «data_copy», которая возвращает содержимое «сообщения» в виде вектора.
Есть 2 варианта, которые я пробовал. Один из них - использовать непосредственно конструктор копирования для инициализации нового вектора.
std::vector<uint8_t> vector1 ( message.data_copy() );
Второй вариант - попытаться избежать дополнительной копии и выполнить
std::vector<uint8_t> vector1 ( std::move( message.data_copy() ) );
. data_copy () делает.
std::vector<uint8_t> message::data_copy(void) const
{
std::vector<uint8_t> d(this->size());
copy_data_to_buffer(d.data());
return d;
}
void message::copy_data_to_buffer(uint8_t* buffer) const
{
DEBUG_LOG("copy_data_to_buffer");
for(const fragment* p = &head; p != nullptr; p = p->next)
{
memcpy(buffer, p->data[0], p->size[0]);
buffer += p->size[0];
if(p->size[1])
{
memcpy(buffer, p->data[1], p->size[1]);
buffer += p->size[1];
}
}
}
Наконец, с помощью профилировщика я сравниваю количество вызовов malloc. Хотя можно было бы ожидать, что конструктор перемещения позволит избежать дополнительной копии в действительности, в обоих случаях они одинаковы.