Проблема компилятора Visual Studio 2005 C при оптимизации оператора switch - PullRequest
4 голосов
/ 10 сентября 2009

Общий вопрос , который может представлять интерес для других:

Я столкнулся с, как мне кажется, проблемой C ++ - оптимизации компилятора (Visual Studio 2005) с оператором switch. Я хотел бы знать, есть ли способ удовлетворить моё любопытство и выяснить, что компилятор пытается, но не может сделать. Могу ли я потратить какое-то время (возможно, слишком много) на расшифровку журнала?

Моя конкретная проблема для тех, кому достаточно любопытно продолжить чтение - я хотел бы услышать ваши мысли о том, почему у меня возникают проблемы в этом конкретном случае.

У меня есть крошечная программа с примерно 500 строками кода, содержащим оператор switch. Некоторые из его случаев содержат некоторое назначение указателей.

double *ptx, *pty, *ptz;
double **ppt = new double*[3];

//some code initializing etc ptx, pty and ptz 

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

Кажется, что в среднем выражении зависает компилятор. Компиляция никогда не заканчивается. Хорошо, я не стал ждать дольше, чем нужно, чтобы пройтись по коридору, поговорить с некоторыми людьми, взять чашку кофе и вернуться к моему столу, но это крошечная программа, которая обычно собирается менее чем за секунду. Удалите одну строку (указанную в приведенном выше коде), и проблема исчезнет, ​​как и при удалении оптимизации (для всей программы или с использованием #pragma в функции).

Почему эта средняя линия вызывает проблемы? Оптимизатору компиляторов не нравится pty. В программе нет разницы в векторах ptx, pty и ptz. Все, что я делаю для pty, я делаю для ptx и ptz. Я попытался поменять их позиции в ppt, но pty все еще оставалась линией, вызывающей проблему.

Я спрашиваю об этом, потому что мне интересно, что происходит. Код переписан и работает нормально.

Edit: Почти две недели спустя я проверяю наиболее близкую версию к коду, который я описал выше, и я не могу отредактировать его обратно, чтобы он вылетел. Это действительно раздражает, смущает и раздражает. Я попробую еще раз, но если в ближайшее время это не сломается, думаю, эта часть вопроса устарела, и я ее уберу. Очень жаль, что вы нашли время.

Ответы [ 4 ]

1 голос
/ 10 сентября 2009

Если вам нужно сделать этот код компилируемым, не слишком меняя его, рассмотрите возможность использования memcpy, где вы присваиваете значение ppt[1]. Это должно по крайней мере компилировать нормально. Однако ваша проблема больше похожа на то, что другая часть исходного кода вызывает такое поведение.

То, что вы также можете попробовать, это поместить следующее:

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

в другой функции. Это также должно немного помочь компилятору избежать пути компиляции вашего кода.

0 голосов
/ 15 сентября 2009

Вероятно, это связано с тем, что вы объявили ptx, pty и ptz, и они оптимизированы для использования одного и того же адреса. Тогда это действие вызывает проблемы вашего компилятора позже в вашем коде.

Попробуйте

static double *ptx;
static double *pty;
static double *ptz;
0 голосов
/ 10 сентября 2009

Звучит как ошибка компилятора. Вы пытались изменить порядок строк? например,

ppt[1]=pty; 
ppt[0]=ptx;
ppt[2]=ptz;

Кроме того, что произойдет, если вы будете манипулировать назначенными значениями (которые приведут к ошибкам в вашем коде, но могут указывать, является ли указатель или массив проблемой), например ::

ppt[0] = pty;
ppt[1] = ptz;
ppt[2] = ptx;

(или аналогичный).

0 голосов
/ 10 сентября 2009

Вы пытались переименовать pty во что-то другое (т.е. pt_y)? Я пару раз сталкивался (то есть с переменной «rect2») с проблемой, что некоторые имена кажутся «зарезервированными».

...