Re: Defect Report: Inlining and observable behavior
On Jun 26, 7:51 pm, opo...@yahoo.com (Ofer Porat) wrote:
The C++ standard does not say whether inlining a function may alter the
observable behavior of a program.
It does say that inlining does not affect the semantics of a
program. Inlined or not, the possible legal observable
behaviors are the same.
Example:
==========
enum CatState
{
Dead,
Alive
};
volatile CatState SchroedingersCat = Alive;
struct T
{
T() {}
T(T const&) { SchroedingersCat = Dead; }
};
inline void g(T const& p)
{
T q(p);
}
int main()
{
g(T());
return 0;}
==========
If g() is not inlined, T's copy constructor must be called when
initializing q.
No. The standard explicitly gives the compiler the right to
elide the copy constructor in this case. If calling the
copy constructor changes the observable behavior of the program,
there are two different possible legal observable behaviors.
Which one you get is unspecified.
(In the above, of course, nothing has any effect on observable
behaviour, and a good compiler will probably eliminate the call
to g completely, along with any construction of T. Regardless
of whether g is inlined or not.)
The copy may not be elided, since the temporary used
to initialize q is bound to the reference parameter p.
So. The standard says that it can be elided. I think the most
recent draft even says that there may not be a copy.
If g() is inlined, the compiler could conceivably eliminate the
single-use parameter p and transform main() to
int main()
{
T q(T());
return 0;
}
At this point, since the temporary is no longer bound to a reference,
the copy may be elided, and q can be value-initialized directly. This
changes the observable behavior of the program.
The C++ standard does not say anything about what transformations are
allowed when inlining a function. In particular, it doesn't say
whether inlining is allowed to change the observable behavior.
Inlining has no effect on the set of allowed observable
behaviors. In this case, the only observable behavior that the
program has is to return 0. And the program is simple enough
that I expect most compilers will not generate anything else, at
least when optimization is turned on.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]