Сначала проверяется, делятся ли все 3 аргумента на 4. Если - и только если - все они равны, то выполняется копирование 4 байтов за раз.
Т.е. это не закодированобыло бы
if ((long) src % 4 == 0 && (long) dst % 4 == 0 && count % 4 == 0 )
{
count = count / 4;
for (i = 0; i < count; i++)
((int *)dest)[i] = ((int *)src)[i];
}
Я не уверен, тестировали ли они свой компилятор, и он генерировал плохой код даже для теста, и поэтому они решили написать его таким замысловатым способом.В любом случае x | y | z
гарантирует, что в результате будет установлен бит n , если он установлен в любой из x
, y
или z
.Поэтому, если (x | y | z) & 3
приводит к 0, ни в одном из чисел не было установлено ни одного из 2 младших битов, и поэтому оно делится на 4.
Конечно, было бы глупо использовать now - стандартная библиотека memcpy
в последних реализациях библиотеки почти наверняка лучше, чем эта.
Следовательно, на последних компиляторах вы можете оптимизировать все вызовы Q_memcpy
с помощьюпереключая их на memcpy
.GCC может генерировать такие вещи, как 64-битные или SIMD-перемещения с memcpy
в зависимости от размера области, которая будет скопирована.