Рекурсивно копировать память, используя область, которую вы уже заполнили в качестве шаблона за итерацию (O (log (N)):
int fillLen = ...;
int blockSize = 4; // Size of your pattern
memmove(dest, srcPattern, blockSize);
char * start = dest;
char * current = dest + blockSize;
char * end = start + fillLen;
while(current + blockSize < end) {
memmove(current, start, blockSize);
current += blockSize;
blockSize *= 2;
}
// fill the rest
memmove(current, start, (int)end-current);
[EDIT] Что я имею в виду под «O (log (N))», так это то, что время выполнения будет намного быстрее, чем если бы вы заполняли память вручную, поскольку memmove()
обычно использует специальные, оптимизированные вручную циклы ассемблера, которые сверкают быстро.