Оптимизации в release, MVC++ 2010

Nov 18, 2010 01:53

Внезапный баг.
Примерное описание исходника:
|int countDp(int cur, int add)
|{
| if(cur == n)
| {
| | dp[cur][add] = add * infin;
| | return dp[cur][add];
| }
| int count1 = countDp(cur + 1, 0);
| int count2 = countDp(cur + 1, 1);
| dp[cur][add] = infin;
| for(..)
| {
| | ..//кусок кода, в котором нет вызовов countDp и обращений к count1 и count2
| }
| return dp[cur][add];
|}
|int main()
|{
| ...
| int x = countDp(0, 0);
| printf("%d", x);
|}
Отрабатывало, грубо говоря, не так, как надо было. В debug'е - все нормально.
Вопрос: что нужно поменять, чтобы все начало работать?

Если не менять тип возвращаемого значения, то достаточно после строки "dp[cur][add] = add * infin;" дописать любую парочку строк, в которой будет так или иначе анализироваться содержимое dp[cur][add] (в моем случае if(dp[cur][add] == 146) throw 42;). Видимо (прошу прощения за бред, если это бред), вызван этот эффект тем, что анализируя код, компилятор считает, что если я явно не использую с1, с2 и вообще нигде не анализирую в явном виде то, что вернет countDp, значит, присваивание можно опустить.
Понятно, что я написал кривовато, и поленился в определенный момент сделать эту функцию void'ом. Но, я полагаю, что не исключены ситуации, в которых писать аналогичные вещи весьма логично и не противоестественно. Это недостаток компилятора, или все же нет таких ситуаций, в которых таким образом писать можно?

АСМ

Previous post Next post
Up