簡體   English   中英

C / C ++ - 覆蓋默認函數

[英]C/C++ - overriding default functions

我有以下問題:

Microsoft Visual Studio (我使用的是2008 SP1)是否提供了覆蓋標准C函數的任何方法,例如mallocmemcpy

假設我有一些外部構建的庫,其中包含malloc.objmemcpy.obj 庫名為library.lib

我應該如何構建我的項目,以便編譯器使用我的(重寫)版本的malloc()memcpy()例程而不是那些提供的(我假設它們共享相同的語法)

整個這個問題的關鍵在於改變我的項目中的每個malloc而不使用像my_malloc或類似的名稱別名,這樣我就可以比較性能。

這可能嗎?

謝謝。

是否可以更改構建和鏈接過程,以便替換memcpymalloc的實現? 是。 這是個好主意嗎? 並不是的。

你最好只使用#define邏輯將這些函數重命名為memcpy_testingmalloc_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)版本,其中包含memcpymalloc函數(以及其他函數),這些函數通常可以在\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM