В проекте, над которым я работаю, я включил файлы lz4.c и lz4.h из библиотеки this. Поскольку я хотел бы минимизировать размер двоичных файлов, я избегаю использования каких-либо функций библиотеки std. Библиотека сжатия требует реализации memset, memcpy и memmove, и чтобы заставить ее работать, мне пришлось связать несколько стандартных библиотек (т. Е. Msvcrt.lib). Это увеличило двоичный размер от чуть менее 3 килобайт до 34 килобайт. Могу ли я включить только эти функции из стандартной библиотеки или мне нужно написать реализацию этих функций и изменить библиотеку сжатия для их использования? Благодаря!Могу ли я реализовать memset, memcpy и memmove без стандартных библиотек c?
ответ
Все, кроме memmove
может быть реализовано в стандартном C.
void *memcpy(void *dest, const void *src, size_t n)
{
size_t i;
for (i = 0; i < n; ++i)
((unsigned char *) dest)[i] = ((unsigned char *) src)[i];
return dest;
}
void *memset(void *blk, int c, size_t n)
{
size_t i;
for (i = 0; i < n; ++i)
((unsigned char *) blk)[i] = c;
return blk;
}
Однако, делая это настоятельно рекомендуется, потому что вы не достаточно хорошо, чтобы бить компилятор; никто не. Компилятор всегда знает, как сделать самые быстрые функции для платформы, на которую он нацеливается.
Спасибо! Думаю, мне придется изменить библиотеку, чтобы не использовать memmove. Я забыл упомянуть, что он также использует free() и calloc(). Могут ли они быть реализованы? – Fluffy
'malloc' может быть реализован как' sbrk' (см. Главу 8 K & R) – stackptr
Я нахожусь в Windows, поэтому никаких syscalls – Fluffy
Линкера загружает только модули, которые вы ссылаетесь, поэтому вы уже включаете только те функции (плюс любые другие, которые они могут ссылаться). Написание собственных методов, вероятно, будет более чем на 31 K – FredK
Увеличение бинарного размера, скорее всего, связано с включением библиотеки сжатия, а не с связанными системными функциями, такими как memset/memcpy/memmove. Вероятно, вам лучше найти меньшую библиотеку сжатия, чтобы уменьшить размер двоичного файла. См. Эту тему: [Включает ли повлиять размер программы?] (Http://stackoverflow.com/questions/1539619/does-include-affect-program-size). – russianfool
34K кажется намного большим, чем обычный размер этих трех функций. Можете ли вы взглянуть на карту памяти или таблицу символов, чтобы увидеть, что занимает пространство? – user3528438