
On Tuesday, November 08, 2011 10:53:09 Helge Bahmann wrote:
Hi Tim,
* compilers are not required to implement atomics so that sizeof(atomic<T>) == sizeof (T). so the size of a data structure may change when switching compilers.
Yes that's right, however I trust that ABI conventions will be worked out per platform eventually -- people will consider inability to mix icc/gcc/clang/whatever at least on a shared-library level as unacceptable, and currently it works rather well. Also note that the intent of C++11 is to make these low-level structures compatible with C1X so there really is not that much room.
I think that there is value in trying to maintain sizeof(boost::atomic<T>) == sizeof(std::atomic<T>) whatever this is going to mean per platform, and part of the thing I have in my mind is indeed interprocess-safety. I also don't think that Boost.Atomic it is in that state currently, but I am a bit reluctant to make a decision that might shut down this path forever.
I'm not trying to convert you or anything, but to me requirement of binary compatibility between std::atomic and boost::atomic looks excessive. The wish for binary compatibility between different implementations of std::atomic, as well as other STL components is quite understandable, although I doubt that in reality this is achieved beyond the most trivial cases, such as std::pair or std::auto_ptr instances. These implementations denote the same type and from the linker perspective different implementations of std::atomic will still be std::atomic and nothing else. ODR is violated in this case but it might slide. But when you try to operate on boost::atomic as it would be std::atomic, this just looks totally wrong to me. These types are different, so the linker (or compiler for that matter) will never let it go. So the developer will have to do reinterpret_casts explicitly and I believe no sane developer will do that and hope it to work.