2011-06-21 16 views
8

Piszę dość złożoną aplikację, która intensywnie wykorzystuje kontenery STL. Aplikacja ma pojedynczą, względnie prostą, wrażliwą na wydajność sekcję, która jest iterowana na wiele różnych std::map s i jest wykonywana tysiące razy. Testowanie pokazało, że kompilacja z wyłączonymi sprawdzonymi iteratorami jest wyłączona (_SECURE_SCL ustawiona na 0) powoduje prawie dwukrotne przyspieszenie programu jako całości, całkowicie skoncentrowanego w tej sekcji.Selektywne wyłączanie sprawdzanych iteratorów

Jednak nie mogę skompilować aplikacji z _SECURE_SCL ustawionym na 0, ponieważ trzeba połączyć z bibliotekami, które zostały skompilowane z _SECURE_SCL włączonymi i mieszającymi _SECURE_SCL ustawienia prowadzą do problemów. Poza tym uważam za głupie używanie niezaznaczonych iteratorów w całej aplikacji, gdy wszystkie wrażliwe na wydajność bity występują w jednym ekranie z kodem. Byłoby to równoznaczne z wyrzuceniem dziecka z kąpielą.

Jakie opcje mam do wybiórczego używania niezaznaczonych iteratorów dla kodu/kontenerów wrażliwych na wydajność przy zachowaniu kompatybilności z bibliotekami skompilowanymi ze sprawdzonymi iteratorami?

+0

Dzięki za pomoc formatowania! – drxzcl

+0

Cieszę się, że mogę Ci pomóc. Dobre pytanie powinno dobrze wyglądać! –

Odpowiedz

4

Działa to dla mnie:

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

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

ui++; 
+0

Działa wspaniale, jesteś moim bohaterem! To niesamowite, jak trudno jest znaleźć informacje na temat tych rzeczy. – drxzcl

+0

To rozwiązanie nie jest obsługiwane w VC9/VS2008, czy to prawda? – drxzcl

+1

Tak, kodowanie zostało wykonane w VS2010. – nnn

6

Jak już się dowiedziałeś, nie można mieszać kodu, który używa zaznaczonych/niezaznaczonych iteratorów, więc aby użyć go w części kodu, musisz przekazać tej części interfejs, który nie wymaga przekazywania kontenery i iteratory. (Zauważ, że to rozciąga się na std::string.)
I oczywiście będziesz musiał umieścić ten kod we własnym pliku wykonywalnym (DLL). Oczywiście wymaga to, aby nie było zbyt wielu połączeń w obrębie tego interfejsu API.

Będąc po bezpiecznej stronie, rozważałbym nawet umieszczenie tej części w bibliotece DLL z interfejsem C.

+0

Dzięki za odpowiedź. Nie do końca to miałem nadzieję usłyszeć, ale ma to sens. A co z wykorzystaniem kontenerów z innej implementacji STL? – drxzcl

+0

@Ranieri: Ten sam ból: _vój_ prawdopodobnie nie zadziała. – sbi

Powiązane problemy