LINUX.ORG.RU

История изменений

Исправление 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.