Если кратко описать вопрос то будет примерно так:
Шаблон wstring
при присвоении ему значения, делает копирование, или он инициализирует новый объект и перезаписывает старые данные, именно при присваивании.
Т.е. данный код перезапишет значения, или выделит новую пямять под строку из кучи и сохранит новый указатель на строку?
class someclass
{
private:
std::wstring m_str;
public:
someclass()
{
m_str = std::wstring(L"Some old string");
m_str = std::wstring(L"Some new string");
}
}
Данный код выполнит именно то, что вы написали: создаст независимый временный объект типа std::wstring
, содержащий вашу строку, а затем сделает присваивание этого объекта в строку m_str
при помощи перемещающего оператора присваивания.
Временный объект будет создаваться "с нуля", то есть в общем случае будет выделяться новая память из кучи (если не сработает какая-нибудь оптимизация, типа хранения коротких строк напрямую, без выделения в куче).
А перемещающий оператор присваивания можно реализовать разными способами. Это деталь реализации. Если строки хранятся без использования кучи (короткие строки), то перемещение сведется к копированию. Если все же использована куча, то можно сначала освободить старые данные, а потом выполнить перемещение из правой части путем перецепления указателей. А можно просто сделать swap
полей объектов. И т.д. и т.п.
И так два раза.
А уж насколько компилятор умен и насколько сложно ему будет понять, что первое присваивание "не нужно", зависит еще от вороха дополнительных деталей (встроится ли код присваивания, знает ли компилятор семантику этого присваивания и т.д.)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день добавил 3 иконки в toolbar он сгруппировал их в ментоесть 1 иконка есть другая кионка группировки
Я впервые использую rxjava и прочитав о subscribeOn(SchedulersnewThread()) и observeOn(Schedulers