2016-05-19 5 views
1

В проекте, над которым я работаю, я включил файлы lz4.c и lz4.h из библиотеки this. Поскольку я хотел бы минимизировать размер двоичных файлов, я избегаю использования каких-либо функций библиотеки std. Библиотека сжатия требует реализации memset, memcpy и memmove, и чтобы заставить ее работать, мне пришлось связать несколько стандартных библиотек (т. Е. Msvcrt.lib). Это увеличило двоичный размер от чуть менее 3 килобайт до 34 килобайт. Могу ли я включить только эти функции из стандартной библиотеки или мне нужно написать реализацию этих функций и изменить библиотеку сжатия для их использования? Благодаря!Могу ли я реализовать memset, memcpy и memmove без стандартных библиотек c?

+1

Линкера загружает только модули, которые вы ссылаетесь, поэтому вы уже включаете только те функции (плюс любые другие, которые они могут ссылаться). Написание собственных методов, вероятно, будет более чем на 31 K – FredK

+0

Увеличение бинарного размера, скорее всего, связано с включением библиотеки сжатия, а не с связанными системными функциями, такими как memset/memcpy/memmove. Вероятно, вам лучше найти меньшую библиотеку сжатия, чтобы уменьшить размер двоичного файла. См. Эту тему: [Включает ли повлиять размер программы?] (Http://stackoverflow.com/questions/1539619/does-include-affect-program-size). – russianfool

+0

34K кажется намного большим, чем обычный размер этих трех функций. Можете ли вы взглянуть на карту памяти или таблицу символов, чтобы увидеть, что занимает пространство? – user3528438

ответ

1

Все, кроме 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; 
} 

Однако, делая это настоятельно рекомендуется, потому что вы не достаточно хорошо, чтобы бить компилятор; никто не. Компилятор всегда знает, как сделать самые быстрые функции для платформы, на которую он нацеливается.

+0

Спасибо! Думаю, мне придется изменить библиотеку, чтобы не использовать memmove. Я забыл упомянуть, что он также использует free() и calloc(). Могут ли они быть реализованы? – Fluffy

+0

'malloc' может быть реализован как' sbrk' (см. Главу 8 K & R) – stackptr

+0

Я нахожусь в Windows, поэтому никаких syscalls – Fluffy