KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am using Intel C++ compiler 12.0, and working on a program similar to the following, which is very simple and straightforward. The while loop should stop in the first run. However, when I build the code using /O2 flag with the Intel compiler, the while loop never stops. If I disable the optimization, or use visual C++, the loop exits normally. If I change pt->flag to p.flag, which I suppose is the same thing, the loop exits normally too. I think it has something to do with Intel's optimization. Is this a bug in the Intel compiler? or I missed something here? #include <iostream> using namespace std; struct para { int i; int flag; }; int main(int argc, char **argv) { para p; p.i = 0; p.flag = 1; para * pt = &p; cout << "loop started" << endl; int i; while (p.flag) { if (p.i == 0) { for (i=0; i<1; i++) { if (p.flag != 1) break; } if (i==1) { pt->flag = 0; } } } cout << "loop stopped" << endl; return 1; } Updates: Thanks for everybody's answer. I am confused by the explanation of "pointer aliasing". If p is in the registers and pt can't access it, why the following code will break the while loop with the intel compiler? Firstly "pt->flag = 0;" should never take effect because i=0. Secondly even if it's in effect, shouldn't "pointer aliasing" prevent p being modified? BTW: Can anybody let me know how to turn on/off the pointer aliasing in Visual Studio with intel compiler? Thanks! #include <iostream> using namespace std; struct para { int i; int flag; }; int main(int argc, char **argv) { para p; p.i = 0; p.flag = 1; para * pt = &p; cout << "loop started" << endl; int i=0; while (p.flag) { if (p.i == 0) { //for (i=0; i<
Tags (comma-separated)
Save Edits
Cancel