Re: [eigen] portable reallocation...

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Finally the patch. It's a bunch of changes so I don't commit right away.

Did I initially say it's easy... I was wrong. ;)

Anyways, it seems to be working now. There is one warning coming from
GCC - is it possible to disable that per file?

- Hauke

On Fri, Feb 26, 2010 at 3:17 PM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
> 2010/2/26 Hauke Heibel <hauke.heibel@xxxxxxxxxxxxxx>:
>> On Fri, Feb 26, 2010 at 12:48 PM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
>>> Since this will only be used by Eigen, specifically by
>>> conservativeResize, your portable realloc wrapper doesn't have to have
>>> the standard realloc API where only the new size is passed. You can
>>> instead write your own realloc-like function that also takes the old
>>> size as an argument.
>>
>> Yes, I tried that. After implementing this, I stumbled over something
>> rather strange which we might want to discuss. :)
>>
>> When creating new memory we do
>>
>> template<typename T, bool Align> inline T*
>> ei_conditional_aligned_new(size_t size)
>> {
>>  T *result = reinterpret_cast<T*>(ei_conditional_aligned_malloc<Align>(sizeof(T)*size));
>>  return ei_construct_elements_of_array(result, size);
>> }
>>
>> For integral types the compiler seems to be able to remove
>> 'ei_construct_elements_of_array' but as soon as we try to allocate
>> e.g. std::complex arrays or user types T, the memory will be filled
>> with 'size' times 'new T()' -- why? Why do we initialize memory for
>> non integral types? I thought we agreed upon uninitialized matrix
>> creation!?
>
> We agreed to not initialized by zero.
>
> But we still have to call default constructors for each entry of the
> array. For example, imagine that the user is using Eigen with some
> multiple-precision numbers class as the Scalar type. Such a class
> would probably have a default constructor allocating some memory or at
> least initializing some pointers, even if it doesn't initialize
> anything by zero!
>
> So we are calling T() on each coefficient, but we're not initializing
> by zero (or initializing to any particular value at all).
>
> Then, if for some type T, T() initializes by zero, that's not our
> fault, it's the design choice of type T. At least that's not the case
> for int,float,double  (ints are not special in this respect). I don't
> know about std::complex but if they do initialize by zero then that's
> their own choice, not our fault.
>
>>
>> Just try
>>
>> VectorXcd m(50);
>> std::cout << m << std::endl;
>>
>> it will be all zeros - and not uninitialized objects.
>
> It's all zeros indeed, but that doesn't mean that they were
> initialized to zero. For example, I tried with VectorXi and I got
> zeros too: that means that the memory there happened to be filled with
> zeros.
>
> Benoit
>
>>
>> Maybe somebody has an idea?
>>
>> - Hauke
>>
>>
>>
>
>
>

Attachment: realloc.patch
Description: Binary data



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/