C / C ++ - переопределение функций по умолчанию - PullRequest
3 голосов
/ 28 сентября 2010

У меня следующий вопрос:

Имеет ли Microsoft Visual Studio (я использую 2008 SP1) любой способ переопределить стандартные функции C, такие как malloc, memcpy?

Предположим, у меня есть внешняя библиотека, которая содержит malloc.obj и memcpy.obj.Библиотека называется library.lib.

Как мне построить свой проект, чтобы компилятор использовал мои (переопределенные) версии подпрограмм malloc() и memcpy() вместо предоставленных (Iпредположим, что они используют один и тот же синтаксис) ?

Суть всего этого в том, чтобы изменить каждый malloc в моем проекте без создания псевдонимов имен, таких как my_malloc или similiar, чтобы я мог сравнить производительность.

Возможно ли это?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 28 сентября 2010

Можно ли изменить процесс сборки и компоновки, чтобы заменить реализацию memcpy и malloc?Да.Это хорошая идея?Не совсем.

Было бы лучше просто использовать логику #define, чтобы переименовать эти функции во что-то вроде memcpy_testing и malloc_testing, а затем иметь один #define, который переключается между ними.Таким образом, ваше решение будет более переносимым на другие системы сборки, и другим программистам станет более понятно, что вы делаете на земле.

Редактировать: В соответствии с комментариями, вот пример того, что вы 'сделать в общем заголовочном файле:

#ifdef testing
#    define my_malloc(n) testing_malloc(n)
#else
#    define my_malloc(n) malloc(n)
#endif

Вы можете даже поддерживать переключение во время выполнения, если это необходимо, используя указатели функций:

void *(__cdecl *my_malloc)(size_t);
// ...
void SetToTest() { my_malloc = testing_malloc; }
void SetToStandard() { my_malloc = malloc; }
1 голос
/ 28 сентября 2010

Вы можете создать свою собственную версию библиотеки времени выполнения Visual C ++ C (CRT), которая содержит функции memcpy и malloc (среди прочих) из исходного кода, который обычно можно найти в \Program Files\Microsoft Visual Studio 9.0\VC\crt. Затем свяжите вашу программу с пользовательским CRT.

В качестве альтернативы вы можете использовать технику из этой официальной статьи для перехвата функций выделения.

1 голос
/ 28 сентября 2010

Не пробовал это, но - в свойствах проекта -> компоновщик -> ввод, установите «Игнорировать все библиотеки по умолчанию» на Да.Затем установите «Дополнительные зависимости» = library.lib; libcmt.lib.

Это должно включать вашу библиотеку перед стандартным статическим CRT.При условии, что функция связывания одинакова в каждом, это должно делать то, что вы хотите.Хотя то, как malloc / free связаны с ОС в двух статических библиотеках, может быть проблематичным.Я полагаю, что library.lib также переопределяет realloc / free / calloc и т. Д.

0 голосов
/ 28 сентября 2010

Глядя на реализацию NedMalloc, который является пользовательским распределителем NedMalloc кажется, что он просто использует #define nedmalloc malloc

В заголовочном файле написано, что он должен работать в Windows.

Существует также запас на запас это с открытым исходным кодом, так что вы можете посмотреть, как они это делают.

Есть проблема и для C ++. Если в окнах указан новый оператор, который просто использует malloc, то все работает с вашим пользовательским распределителем. В противном случае вы должны переопределить как 6 операторов для выделения и удаления вещей C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...