Dzisiaj w pracy natknałem się na bardzo głupi błąd, nad którym starciłem kilkanaście cennych minut. Może nie ma czym się chwalić ale warto zwrócić na to uwagę. Dodawałem do pewnego modułu, functor i chciałem go przetestować w ten oto sposób (pseudo kod):
void Init()
{
Functor<CFoo> func(&mFoo, &CFoo::foo);
myObj->SetFunctor(&func);
}
Jakież było moje zdziwienie, gdy poźniej chciałem wywołać mojego functora, oczywiście poza metoda Init()
Ciekawe co się stało z func i wskaźnikiem na niego po wyjściu z init?
Na usprawidlenie mogę powiedzieć tylko to, że na platformę na jaką to było pisane nie używamy debugera z visual stuio i trzeba debugować narzędziem zewnętrznym i to dość "ciężkim".
Kolejną rzeczą o której chcę wspomnieć jest różnica w prędkości wykonywania się pre i post inkrementacji. Kiedyś w jakiejś książce dość starej książce wyczytałem żeby stosować pre inkrementacji zamiast postinkrementacji, i że niby to jest szybsze. Do tego dzisiaj kolega zwrócił mi na to uwagę w moim kodzie więc postanowiłem to sprawdzić na przykładzie kompilatora z visual studio 2008 express. Zrobiłem prosty przykład (pętla for wykonana 1000x z kilkoma mnożeniami i dodawaniami w środku) i dzięki pomocy kolegi który się zna na assemblerze zdeassemblorawalismy go. I co się okazało? Oba kody są identyczne
Może w jakiś skomplikowanych przykładach jest jakaś znaczna różnica ale przy zwykłych forach i inkrementacjach przy dzisiejszych kompilatorach i procesorach, różnicy nie ma (przynajmniej mi się tak zdaje
.






