Using the following struct,
struct A
{
A(int d1, int d2)
{
data1 = d1;
data2 = d2;
}
int data1, data2;
};
will the last line in the function below dereference the pointer again, or will the compiler know to use the previously dereferenced object?
int main()
{
A* a = new A(1, 2);
//dereference a
cout << a->data1 << endl;
//dereference a again?
cout << a->data2 << endl;
}
If not, are there any compilers that might do this?
I know that I can perform an experiment to test my question however I do not know assembly language very well.
Yes, it is possible that in cases like this the generated code will not literally perform another dereference. This will occur when the compiler can tell for sure that a
won't change between the two statements.
This is a common category of optimisation, and is the cause of many bugs when people violate strict aliasing rules (because this potentially breaks the compiler's ability to detect that a
hasn't changed).