В настоящее время я работаю над собственным распределителем на С++. Этот распределитель должен регулярно дефрагментировать свою память, перемещая память и объекты. Эти сдвиги всегда нисходящие, а это означает, что адрес перемещаемого фрагмента памяти всегда уменьшается при его перемещении. Это не проблема, если старый блок памяти и новый блок памяти не перекрываются. Если они перекрываются, я сначала должен переместить объект во временную область за пределами памяти распределителя, а затем переместить его обратно в новый фрагмент памяти.
Если для перемещаемого типа std::is_tribuly_move_constructible имеет значение true, то я могу сохранить это дополнительное перемещение во временном фрагменте памяти, если порядок присваиваний внутри конструктора перемещения по умолчанию четко определен. Это приводит к моему вопросу: хорошо ли определен порядок назначений или он зависит от платформы?
memcpy
или аналогичный по правилу «как если». Тем не менее, компилятор теоретически может копировать спереди назад, или сзади вперед, или сначала нечетные байты, а затем четные байты; Я не думаю, что такие гипотетические реализации будут несоответствующими. - person Igor Tandetnik   schedule 01.07.2017