You can replace "signed integer overflow" with pretty much whatever 'guarantee' in C that suits your fancy.
See below.

"Jonathan M Davis" wrote in message news:[email protected]...
I don't follow.
Let's see if this is better.

The D compiler guarantees that as long as you don't cast away const, const will never be mutated.
The C compiler guarantees that as long as signed integers don't overflow, their results will be correct.

If you _do_ cast away const and then mutate the variable, you are doing something which is undefined.
If you _do_ overflow signed integers, their results will be undefined.

As it is undefined behavior, _anything_ could happen if you do it, and the compiler is free to assume that it will never happen.
As it is undefined behavior, the result could be _anything_ if you do it, and the compiler is free to assume that it will never happen.

So, it effectively has a guarantee that a const variable will never be mutated (save by another, mutable reference to the same data). It then uses that guarantee for optimizations.
So, it effectively has a guarantee that a signed integer will never be overflown. It then uses that guarantee for optimizations.

To make it 100% iron-clan, casting away const would have to be illegal, but that would be unacceptable in a systems language - particularly when you want to be able to call C functions which may not be properly annotated.
To make it 100% iron-clan, signed overflow would have to be illegal, but that would be unacceptable in a systems language - particularly when you need to depend on system-dependent behavior.

So instead, the compiler assumes that its guarantee holds in the case where you cast away const, and is still able to use it for optimizations.
So instead, the compiler assumes that its guarantee holds in the case where overflow a signed integer, and is still able to use it for optimizations.

C++ _does_ define what happens when you cast away const and mutate a variable, so it guarantees that that behavior will be safe.
D _does_ define what happens when you overflow a signed integer, so it guarantees that that behavior will be safe.

In so doing however, it is then unable to assume that casting away const will not result in the variable being mutated and is therefore unable to use const for much in the way of optimizations.
In so doing however, it is then unable to assume that a signed integer will never be overflown, and is therefore unable to use signed integer overflow for much in the way of optimizations.

- Jonathan M Davis
Mehrdad

Reply via email to