const int x = 2;
The typical behavior of an optimizing compiler is to allocate memory for
x
only if its address is explicitly taken with an &
operator or it is bound to a reference. (Otherwise constant propogation is sufficient.)Now let’s assume we can only change the codes, compile and run them. Disassembly is not allowed. (That’s like physics - we can only do experiments and observe the results.) Then we are unable to find out whether
x
actually has an address. The only way we can detect it is to take its address and see whether there’s going to be a compiling error. But this process creates an address for it. (In physics, when we are measuring the position and momentum of a particle, we are changing its position and/or momentum.)A similar thing is about the default constructor, default copy-constructor, default copy-assignment and default destructor. Some books say that a class always has them (in semantics); some books say compilers create them on demand (in implementation). Both are right - we cannot detect this in program.
Time (if any) before the Big Bang is irrelavent to our universe, so we can assert time did not exist before the Big Bang for a simpler model. Likewise, we can assert (semantically) a constant always has an address, and a class always have the four things, for a simpler model.
No comments:
Post a Comment