[英]C/C++ - overriding default functions
我有以下問題:
Microsoft Visual Studio (我使用的是2008 SP1)是否提供了覆蓋標准C函數的任何方法,例如malloc
, memcpy
?
假設我有一些外部構建的庫,其中包含malloc.obj
和memcpy.obj
。 庫名為library.lib
。
我應該如何構建我的項目,以便編譯器使用我的(重寫)版本的malloc()
和memcpy()
例程而不是那些提供的(我假設它們共享相同的語法) ?
整個這個問題的關鍵在於改變我的項目中的每個malloc
而不使用像my_malloc
或類似的名稱別名,這樣我就可以比較性能。
這可能嗎?
謝謝。
是否可以更改構建和鏈接過程,以便替換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; }
沒試過,但是 - 在項目屬性 - >鏈接器 - >輸入中,將'忽略所有默認庫'設置為是。 然后設置'Additional Dependencies'= library.lib; libcmt.lib。
這應該包括您的庫在標准靜態CRT之前。 提供的功能聯動是相同的,每個應該做你想要的。 雖然malloc / free如何鏈接到兩個靜態庫中的OS可能會有問題。 我假設library.lib還重新定義了realloc / free / calloc等?
您可以從源代碼構建自己的Visual C ++ C運行時庫(CRT)版本,其中包含memcpy
和malloc
函數(以及其他函數),這些函數通常可以在\\Program Files\\Microsoft Visual Studio 9.0\\VC\\crt
。 然后將您的程序與自定義CRT鏈接。
或者,您可以使用此官方文章中的技術來掛鈎分配函數。
看看NedMalloc是一個自定義分配器NedMalloc的實現 ,看起來他只是使用#define nedmalloc malloc
頭文件說它應該在Windows上工作。
囤積它的開源也很囤積,所以你可以看看它們是如何做到的。
C ++也存在問題。 如果windows包含將new運算符定義為僅使用下面的malloc,那么一切都適用於您的自定義分配器。 否則你必須覆蓋6個運算符來分配和刪除C ++方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.