Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.fortran    |    Putting John Backus on a giant pedestal    |    5,127 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 4,542 of 5,127    |
|    GianLuigi Piacentini to GianLuigi Piacentini    |
|    Re: A question on reallocation    |
|    20 Nov 23 01:10:41    |
      From: ggpiace@tin.it              On 15/11/23 19:40, GianLuigi Piacentini wrote:       > Hi all,       >       > I have a perhaps silly question, that puzzles me before committing to       > write actual code.       >       > Please consider a data structure which is basically an array of arrays       > type element       > integer, allocatable :: element_core(:)       > end type       > ...       > type(elements), allocatable :: array_of_elements(:)       > ...       > allocate ( array_of_elements(some_size) )       >       > (this is not a matrix, each element may significantly differ in size,       > and someone may be long (and subjected to reallocation cycles, but his       > is plain reallocation).       >       > Now I have to increase size of previously allocated array_of_elements,       > using the usual pattern (at least I think it's usual)       >       > type(elements), allocatable :: tmp(:)       >       > allocate ( tmp(new_size) )       > tmp(1:some_size) = array_of_elements !       ***       > call move_alloc(from = tmp, to = array_of_elements)       >       > Seems to me that during the operation marked with the *** comment the       > various elements are also copied, and this seems vasteful.       > Is there a way to avoid such copying, if it really happens ?       >       > Perhaps making array_of_elements an array of pointers to allocated       > elements ?       >       > Thanks in advance       > Gigi Piacentini       Thanks to all replier.              I ewconsidered the problem in light of the whole project, coming with 2       possible solutions:              1) since data come from analysis of several files, which do not change       during program execution, I can do a 1st pass counting dimensions, then       allocate, then do a 2nd pass reading data into the data structure.              2) as suggested, I could do       type element        integer, allocatable :: element_core(:) ! an array of integers       end type       type element_pointer        type(element), pointer :: e_p => null() ! pointer to the above       end type element_pointer              type(element_pointer), allocatable :: array_of_elements(:)              allocate( array_of_elements(3) ) ! an array of 3 pointers       do i = 1, size(array_of_elements)        allocate (array_of_elements(i)%e_p%element_core(n))        ! where n is the size required for the ith array of integers       end do       ... ! loading integers              Now when reallocating              type(element_pointer), allocatable :: tmp(:)              allocate( tmp(new size for array of array of integers) )              ! copying pointers:       tmp(1:size(array_of_elements))%e_p => array_of_elements%e_p       ! during this copy, in my intention, the underlying element_cores will       not be moved       call move_alloc (from = tmp, to = array_of_elements)              However, at the moment I cannot test the above machinery, I will do it       as soon as I can restart my hobby project, which will happen in some days.       But I am still interested in the subject, and in your comments, if any.              Thanks       Gigi              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca