История изменений
Исправление Siborgium, (текущая версия) :
Нет. Компилятор знает семантику memcpy и может полностью исключить обращение к библиотечным вызовам. Это делается на основе информации о размере копируемых регионов памяти; на x86 для uint32_t
на любом уровне оптимизации там будет просто load/store.
Сложнее ситуация для ARM, так как для обращения требуется выравнивание, о котором компилятор в общем случае не знает, значит будет вынужден исходить из worst case и приседать для загрузки невыровненных данных. Что для uint32_t скорее всего приведет к нескольким load/store по частям.
Если ты выравнивание обеспечиваешь сам, можно сделать каст с разыменованием. Если бояться «UB» и идти по пути memcpy, в C++ есть std::assume_aligned, в gcc – __builtin_assume_aligned
.
Исходная версия Siborgium, :
Нет. Компилятор знает семантику memcpy и может полностью исключить обращение к библиотечным вызовам. Это делается на основе информации о размере копируемых регионов памяти; на x86 для uint32_t
на любом уровне оптимизации там будет просто load/store.
Сложнее ситуация для ARM, так как для обращения требуется выравнивание, о котором компилятор в общем случае не знает. Если ты его обеспечиваешь сам, можно сделать каст с разыменованием. Если бояться «UB» и идти по пути memcpy, в C++ есть std::assume_aligned, в gcc – __builtin_assume_aligned
.