[fpc-devel] Aligned dynamic arrays / Maybe implement in mem-mgr?

Martin Frb lazarus at mfriebe.de
Fri Mar 29 18:21:41 CET 2019


On 29/03/2019 17:53, Ryan Joseph wrote:
> First minor snag, fpc_dynarray_insert, fpc_dynarray_concat can allocate new arrays like SetLength can. Do we need to make aligned variants for these also? Using array + operators there is no possibility to set alignment.
>
> 1) ignore the problem
> 2) make extra syntax like:
>
> 	a: array of integer; alignment = 64;
>
> 3) make another function to allocate an empty array that sets alignment
>
> 	SetAlignment(a, 64);
> 4) for insert/concat make variants like InsertAligned() and ignore + operators for aligned arrays
>

Question: Should the alignment be "user data" or "type info".
Does it need to be determined at runtime, and set to different values 
(for the same type/variable) at runtime?

If not, i.e. if a specific variable always needs 4k alignment, would it 
not be more logical to make it part of the type?
    type TFoo = array [x..y] of byte aligned 4096;

Of course that does not change the above problem.
The (current or fixed) alignment needs to be stored, so concat can 
retrieve it and honour it.
Stored either in the header or the RTTI type info



Question 2:
Would it not be more efficient, if the alignment would happen in the 
memory manager?
Then no over-allocation would be needed. And the memory that is skipped 
in front of the array could be used for other data.

The memory manager would need 2 new methods:
AllocMemAtAllignment
FreeMemWithAllignment

So the array still needs to know, it was allocated with Allignment and 
call the correct  FreeMemWithAllignment.
As a default for all memory manager AllocMemAtAllignment could do the 
over-allocate, and return the correct pointer, with the mem-managers 
align header.
Individual MemManagers can then be optimized.

pseudo code for AllocMemAtAllignment
   mem := alloc(size+align+sizeof(MemMgrAlignHeader))
   result := getNextAlignedAddr(mem+sizeof(MemMgrAlignHeader))
   (result-sizeof(MemMgrAlignHeader)) ^.RealAllocAddr := mem;

The result looks then like
   mem
      // padding
   result - header:
      RealAllocAddr
   result
     // At least size bytes

So pretty much what would have happened in the array code. But moved to 
the mem-manager.
So it can be:
a) re-used for other types or even called by usercode
b) a mem-manager that can get the aligned address without padding, can 
be optimized, and return a normal block of memory
   (does not even need the MemMgrAlignHeader)














More information about the fpc-devel mailing list