
On 12 April 2011 17:01, Nevin Liber <nevin@eviloverlord.com> wrote:
On 12 April 2011 16:46, Phil Bouchard <philippe@fornux.com> wrote:
On 4/12/2011 10:15 AM, Nevin Liber wrote:
Only if it is implemented the way Steven described it. You cannot legally compare pointers using relationship operators (<,<=,>,>=) unless at least one is NULL, they are both pointing within the same object, or both pointing within the same array (or just past the end of the array). All other comparisons are undefined behavior. See 6.5.8 of the C99 standard for a much more precise definition.
I understand but a memory page is in general aligned and therefore the pointer difference (ptrdiff) of the beginning of the page with the location of the object can be valid. In other words the memory page can be an array of type T.
I'm not saying that it won't accidentally work, but once you have undefined behavior, the compiler is free to do anything it wants.
To illustrate this, take the following code: struct Silly { bool is_from(const char* p) { return buffer <= p && p < buffer + sizeof(buffer); } char buffer[1024]; }; I believe that a compiler could legally optimize the body of Silly::is_from to be: { return true; } because in the defined behavior case it returns true, and the compiler can do whatever it wants in the undefined behavior case. As Dave pointed out, the Boost-related issue is that Bool.Pool has a function relying on underfined behavior... -- Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404