2010-09-27 100 views
2

我有以下問題:C/C++ - 覆蓋默認功能

難道微軟的Visual Studio (我用2008 SP1)提供任何方法來覆蓋非標準C函數,如mallocmemcpy

假設我有一些外部構建的庫,其中包含malloc.objmemcpy.obj。 庫被稱爲library.lib

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

整個這件事的關鍵是要改變我的項目中的每個malloc而不使用名稱別名如my_malloc或類似的名稱,以便我可以比較性能。

這可能嗎?

謝謝。

+0

顯然,這個問題是可以在這裏標記'C/C++':)的其中一個問題:) – 2010-09-27 20:20:06

+0

這是一個特定於實現的問題,所以我將您的平臺添加到標記。沒有標準的方法來做到這一點(雖然有標準的方法來做到這一點),所以它將取決於編譯器和構建系統。 – 2010-09-27 20:31:35

回答

1

還沒有嘗試過,但 - 在項目屬性 - >連接器 - >輸入,將'忽略所有默認庫'設置爲是。然後設置'Additional Dependencies'= library.lib; libcmt.lib。

這應該包括你的圖書館之前的標準靜態CRT。提供的功能鏈接是相同的,每個應該做你想做的。儘管在兩個靜態庫中如何將malloc/free鏈接到操作系統可能會有問題。我認爲library.lib還重新定義了realloc/free/calloc等?

+1

如果你這樣做,那麼你會失去這些庫實現的一切,而不僅僅是malloc! – 2014-03-12 23:54:06

8

是否可以更改構建和鏈接過程,以便替換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; } 
+0

我不同意'#define malloc(n)my_malloc(n)'會立即清除。實際上,在代碼本身中進行搜索/替換會更清晰。用'#define'代替甚至可能是危險的:例如,查看代碼網站,很難判斷它是調用系統實現還是自己調用,因此很難判斷使用哪個釋放器。如果與仍然使用系統'malloc'的代碼鏈接(或者某些項目忽略使用'#define'),這會更成問題。 – jamesdlin 2010-09-27 21:29:05

+1

我認爲我的重命名和你的想法是相反的:我建議在代碼中編寫'my_malloc',以清楚地明白某些奇怪的事情正在進行,並在頭文件中寫入'#ifdef testing' /'#define my_malloc(n)testing_malloc(n)'/'#else' /'#define my_malloc(n)malloc(n)'''#endif'。 – Reinderien 2010-09-27 21:34:20

+0

啊,好的。是的,我同意這樣更好。 (我將「這些函數」解釋爲「memcpy」和「malloc」,而不是自定義實現。) – jamesdlin 2010-09-27 21:36:13

1

你可以建立自己的Visual C++的C運行時包含memcpymalloc功能(其中包括)庫(CRT)的版本,從源代碼通常可在\Program Files\Microsoft Visual Studio 9.0\VC\crt中找到。然後將您的程序與自定義CRT相鏈接。

或者,您可以使用this官方文章中的技術來掛鉤分配函數。在實施NedMalloc的是一個自定義分配器NedMalloc他似乎只是使用的#define nedmalloc的malloc

頭文件說,它應該工作在Windows上

0

展望。

還有囤積在hoard它是開源的,所以你可以看看他們是如何做到的。

C++也存在問題。如果windows包括將new運算符定義爲僅在下面使用malloc,那麼所有內容都適用於您的自定義分配器。否則,你必須重寫像6個操作符來分配和刪除C++方法。