2011-06-21 20 views
8

我寫一個相當複雜的應用程序,使大量使用STL容器。該應用程序具有一個相對簡單的性能敏感部分,該部分遍歷多個std::map並執行數千次。測試顯示,與禁用檢查迭代器(_SECURE_SCL設置爲0)編譯相比,結果幾乎將程序整體提升了2倍,完全集中在本節中。選擇性地禁止檢查的迭代

但是,我無法編譯_SECURE_SCL設置爲0的應用程序,因爲需要鏈接到已啓用_SECURE_SCL編譯的庫並混合_SECURE_SCL設置導致問題。另外,我發現在整個應用程序中使用未經檢查的迭代器時非常愚蠢,因爲所有性能敏感的位都發生在單個屏幕代碼中。這就等於用洗澡水把嬰兒扔掉了。

哪些選項我有選擇性地使用未經檢查的迭代器性能敏感的代碼/容器,同時保持與檢查的迭代器編譯庫的兼容性?

+0

感謝您的格式幫助! – drxzcl

+0

很高興提供幫助。一個好問題應該看起來不錯! –

回答

4

這個工作對我來說:

vector<BYTE> v; 
vector<BYTE>::iterator i; 
vector<BYTE>::iterator::_Unchecked_type ui; 

i = v.end(); 
ui = i._Unchecked(); 

ui++; 
+0

它很棒,你是我的英雄!找到關於這些事情的信息有多難。 – drxzcl

+0

此解決方案似乎不支持VC9/VS2008,這是正確的嗎? – drxzcl

+1

是的,編碼是在VS2010中完成的。 – nnn

6

正如你已經發現了,你不能混用,它使用檢查碼/未檢查的迭代器,所以爲了在你的代碼的一部分來使用它,你需要給這部分不需要傳遞任何接口容器和迭代器。 (請注意,這延伸到std::string。)
當然,你將不得不把這些代碼到其自己的可執行文件(DLL)。當然,這要求在該API中來回調用的次數不會太多。

爲了安全起見,我甚至考慮把一部分成DLL與C接口。

+0

感謝您的回答。這不是我希望聽到的,但它是有道理的。從不同的STL實現中使用容器怎麼樣? – drxzcl

+0

@Ranieri:同樣的痛苦:_very_可能無法工作。 – sbi