std::wstring присваивание == копирование

213
04 февраля 2018, 01:32

Если кратко описать вопрос то будет примерно так:

Шаблон 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");
    }
}
Answer 1

Данный код выполнит именно то, что вы написали: создаст независимый временный объект типа std::wstring, содержащий вашу строку, а затем сделает присваивание этого объекта в строку m_str при помощи перемещающего оператора присваивания.

Временный объект будет создаваться "с нуля", то есть в общем случае будет выделяться новая память из кучи (если не сработает какая-нибудь оптимизация, типа хранения коротких строк напрямую, без выделения в куче).

А перемещающий оператор присваивания можно реализовать разными способами. Это деталь реализации. Если строки хранятся без использования кучи (короткие строки), то перемещение сведется к копированию. Если все же использована куча, то можно сначала освободить старые данные, а потом выполнить перемещение из правой части путем перецепления указателей. А можно просто сделать swap полей объектов. И т.д. и т.п.

И так два раза.

А уж насколько компилятор умен и насколько сложно ему будет понять, что первое присваивание "не нужно", зависит еще от вороха дополнительных деталей (встроится ли код присваивания, знает ли компилятор семантику этого присваивания и т.д.)

READ ALSO
Toolbar группирует иконки

Toolbar группирует иконки

Добрый день добавил 3 иконки в toolbar он сгруппировал их в ментоесть 1 иконка есть другая кионка группировки

458
Как в RxJava асинхронно выполнять намерения?

Как в RxJava асинхронно выполнять намерения?

Я впервые использую rxjava и прочитав о subscribeOn(SchedulersnewThread()) и observeOn(Schedulers

209
Random в java по длине ArrayList

Random в java по длине ArrayList

Имею вот такой код в Java:

200