'memcpy' -подобная функция, которая поддерживает смещения по отдельным битам?

Я думал о решении этого, но это выглядит довольно сложной задачей. Если я возьму это сам, я, скорее всего, напишу его несколькими различными способами и выберу лучший, поэтому я решил задать этот вопрос, чтобы посмотреть, есть ли хорошая библиотека, которая уже решает эту проблему, или у кого-нибудь есть мысли / советы.

void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size)
{
    // Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer 
    // needs to be up to one byte longer than it would need to be in memcpy.
    // Maybe explicitly providing the end of the buffer is best.
    // Also note that pSrc has NO alignment assumptions at all.
}

Мое приложение критично ко времени, поэтому я хочу добиться этого с минимальными накладными расходами. Это источник сложности / сложности. В моем случае блоки могут быть довольно маленькими, возможно, 4-12 байт, поэтому крупномасштабные вещи в memcpy (например, предварительная выборка) не так важны. Наилучшим результатом будет тот, который быстрее всего подходит для ввода постоянного размера, от 4 до 12, для случайно выровненных буферов src.

Память должна быть перемещена в блоках размером в слово, когда это возможноВыравнивание этих блоков размером с слово важно. pSrc не выровнен, поэтому нам может потребоваться прочитать несколько байтов с фронта, пока он не выровняется.

Кто-нибудь имеет или знает о подобной реализованной вещи? Или кто-то хочет попробовать написать это, чтобы он был максимально чистым и эффективным?

Редактировать: Кажется, что люди голосуют за это "близко" за "слишком широкий". Несколько сужающихся деталей - AMD64 является предпочтительной архитектурой, поэтому давайте предположим, что. Это означает, что порядок байтов меньше нуля и т. Д. Мы надеемся, что реализация будет хорошо вписываться в размер ответа, поэтому я не думаю, что это слишком широко Я спрашиваю ответы, которые являются единственной реализацией за раз, хотя есть несколько подходов.

Ответы на вопрос(2)

Ваш ответ на вопрос