Bojkar\'s dev blog
sie 6

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 :) .