Я изучал производительность перемещения std::string
. В течение самого долгого времени я рассматривал струнные движения как почти свободные, полагая, что компилятор будет встроить все, и он будет включать только несколько дешевых заданий.
Фактически, моя ментальная модель для перемещения в буквальном смысле
string& operator=(string&& rhs) noexcept
{
swap(*this, rhs);
return *this;
}
friend void swap(string& x, string& y) noexcept
{
// for disposition only
unsigned char buf[sizeof(string)];
memcpy(buf, &x, sizeof(string));
memcpy(&x, &y, sizeof(string));
memcpy(&y, buf, sizeof(string));
}
Насколько я понимаю, это законная реализация, если memcpy
изменен для назначения отдельных полей.
К моему большому удивлению, найти gcc-реализацию перемещения предполагает создание новой строки и, возможно, выброс из-за выделения, несмотря на то, что она не является noexcept
.
Это даже соответствует? Не менее важно, не стоит ли думать, что движение почти бесплатное?
Смутно, std::vector<char>
сводится к тому, что я ожидаю.
реализация clang сильно отличается, хотя есть подозрительный std::string::reserve