Я понял, что в C ++ 11 введена новая семантика перемещения, и, как следствие, контейнеры данных изменяются в соответствии с новыми определениями и спецификациями языка, я не совсем понимаю, какую выгоду от них получают стандартные контейнеры.
Также я думаю, что я понял, что такое Rvalue и как действует семантика перемещения, проблема в том, что я не вижу в этом смысла, перемещение объектов и изменение их меток не звучат как значимая особенность.
Я могу попросить хороший ресурс о том, как map, list, vector, ...
меняются в новом C ++ 11?
Причина, по которой были введены значения RValues и LValues, заключается в том, что перемещение данных объекта может быть намного быстрее, чем копирование. Повышение производительности происходит в основном за счет внутренних указателей, которые не нужно реплицировать во время перемещения, что в противном случае потребовало бы ненужных вызовов malloc и memcpys. Например, std::string
содержит указатель на char
массив, который может быть очень большим. Копирование это будет включать в себя копирование данных в этом char
перемещение массива просто включает в себя копирование указателя на эти данные.
Что касается LValues и RValues, единственное, что, как я знаю, изменилось, — это то, что теперь у нас есть новый блестящий конструктор, и многие функции-члены были переписаны, чтобы использовать преимущества семантики перемещения.
Например, std::vector
теперь имеет std::vector::vector(std::vector&& move)
ctor, и функции как push_back
были изменены, чтобы также принять RValues.
Это должно быть, по большей части, кажется вам безразличным. Если вы пишете библиотеку, а не просто используете ее, вы должны это знать, и URefs тоже.
Вы можете ознакомиться с описаниями контейнеров на cppreference, который объясняет интерфейс STL. Там вы можете найти то, что добавляет стандарт C ++ 11 — он помечен знаком ‘(since C++11)
‘ тег. Если вы нажмете на тип контейнера, он покажет вам, какие методы являются новыми для него.