Нет стандартной библиотечной функции afaik. Поэтому, если вы пишете переносимый код, вы смотрите на цикл.
Если вы пишете непереносимый код, то проверьте документацию на компилятор/платформу, но не задерживайте дыхание, потому что здесь редко можно получить большую помощь. Может быть, кто-то еще соберет примеры платформ, которые что-то предоставляют.
Способ, которым вы должны писать самостоятельно, зависит от того, можете ли вы определить в API, что вызывающий объект гарантирует, что указатель dst будет достаточно выровнен для 64-разрядной записи на вашей платформе (или платформах, если она переносима). На любой платформе, которая имеет 64-битный целочисленный тип, malloc по крайней мере вернет подходящие указатели.
Если вам нужно справиться с неприсоединением, вам нужно что-то вроде ответа moonshadow. Компилятор может встроить/развернуть эту memcpy с размером 8 (и использовать 32-х или 64-разрядные нестандартные команды записи, если они существуют), поэтому код должен быть довольно неудобным, но я предполагаю, что это, вероятно, не будет особенным целая функция для назначения адресата. Я бы хотел, чтобы меня исправили, но я не буду бояться.
Итак, если вы знаете, что вызывающий абонент всегда даст вам dst с достаточным выравниванием для вашей архитектуры и длиной, кратной 8 байтам, затем выполните простой цикл, пишущий uint64_t (или что-то еще 64-битное int в вашем компиляторе), и вы, вероятно, (без обещаний) в конечном итоге получите более быстрый код. У вас наверняка будет более короткий код.
В любом случае, если вы действительно заботитесь о производительности, то профиль его. Если это не достаточно быстро, попробуйте еще раз с большей оптимизацией. Если он все еще не достаточно быстрый, задайте вопрос о версии asm для процессора (ов), на котором он недостаточно быстрый. memcpy/memset может получить значительное увеличение производительности от оптимизации для каждой платформы.
Эта реализация больше, чем я общался с вопросом :) Спасибо! Было бы неплохо, если бы вы объяснили это. Например, я не могу понять, зачем использовать вызов функции для memcpy() вместо назначения. – gnobal 2008-09-21 08:20:31