std::complex standard packing requirements was Re: [eigen] FFT for Eigen |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
I had this discussion a few years ago on comp.lang.c++ when I was
trying to share complex buffers between c99 libs and C++ apps. The bottom line is that the original C++ ISO standard did not require array[2] packing for std::complex, but that requirement was in the standards pipeline and all sane compilers already do it. http://www.cpptalk.net/portable-complex-numbers-between-c-c--vt46432.html http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#387 It should be safe enough to go down that path, but it would still be good to add a compile time check to ensure sizeof( std::complex<T> ) == 2*sizeof(T) and a runtime check for &cpx.imag() - &cpx.real() == 1 -- Mark Benoit Jacob wrote: I'm OK if this doesn't crash. If the STL clearly specifies that the two coords in a complex<> are stored as an array, then it's OK. If on the other hand, some implementation stores the 2 coordinates as just 2 separate members, and someone compiles this with a strict 64 bit alignment, then with complex<float> that will crash. Benoit 2009/5/19 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:Really? The only real() that I can see is const, and anyway, how would we implement that? std::real() and std::imag() only return references with certain GCC implementations while e.g. on GCC 4.0 / Mac they return by value. It seemed to me that allowing that was one of the things that would require us to have our own complex numbers class.arf, you are right., one more stupid annoying std limitation....ok, so, is anyone against adding that: inline float& ei_real(std::complex<float>& x) { return reinterpret_cast<float*>(&x)[0]; } inline float& ei_imag(std::complex<float>& x) { return reinterpret_cast<float*>(&x)[1]; } so that we can have real() returning a lvalue ? Gael. |
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |