14#include "arccore/base/ArgumentException.h"
15#include "arccore/base/NotSupportedException.h"
16#include "arccore/base/NotImplementedException.h"
17#include "arccore/base/TraceInfo.h"
19#include "arccore/collections/IMemoryAllocator.h"
25#if defined(ARCCORE_OS_WIN32)
31#if defined(ARCCORE_OS_LINUX) || defined(ARCCORE_OS_MACOS)
32#define ARCCORE_USE_POSIX_MEMALIGN
47DefaultMemoryAllocator3 DefaultMemoryAllocator3::shared_null_instance;
64 std::memcpy(destination.
baseAddress(), source.baseAddress(), source.size());
70bool DefaultMemoryAllocator::
79void* DefaultMemoryAllocator::
80allocate(
size_t new_size)
82 return ::malloc(new_size);
88void* DefaultMemoryAllocator::
89reallocate(
void* current_ptr,
size_t new_size)
91 return ::realloc(current_ptr, new_size);
97void DefaultMemoryAllocator::
106size_t DefaultMemoryAllocator::
107adjustCapacity(
size_t wanted_capacity,
size_t)
109 return wanted_capacity;
118bool DefaultMemoryAllocator3::
130 return { ::malloc(new_size), new_size };
139 return { ::realloc(current_ptr.
baseAddress(), new_size), new_size };
157 return wanted_capacity;
198void* AlignedMemoryAllocator::
199allocate(
size_t new_size)
201#if defined(ARCCORE_USE_POSIX_MEMALIGN)
203 int e = ::posix_memalign(&ptr, m_alignment, new_size);
209#elif defined(ARCCORE_OS_WIN32)
210 return _aligned_malloc(new_size, m_alignment);
222#if defined(ARCCORE_USE_POSIX_MEMALIGN)
224 int e = ::posix_memalign(&ptr, m_alignment, new_size);
230#elif defined(ARCCORE_OS_WIN32)
240void* AlignedMemoryAllocator::
241reallocate(
void* current_ptr,
size_t new_size)
243#if defined(ARCCORE_USE_POSIX_MEMALIGN)
244 ARCCORE_UNUSED(current_ptr);
245 ARCCORE_UNUSED(new_size);
247#elif defined(ARCCORE_OS_WIN32)
248 return _aligned_realloc(current_ptr, new_size, m_alignment);
260#if defined(ARCCORE_USE_POSIX_MEMALIGN)
261 ARCCORE_UNUSED(current_ptr);
262 ARCCORE_UNUSED(new_size);
264#elif defined(ARCCORE_OS_WIN32)
274void AlignedMemoryAllocator::
277#if defined(ARCCORE_USE_POSIX_MEMALIGN)
279#elif defined(ARCCORE_OS_WIN32)
280 return _aligned_free(ptr);
292#if defined(ARCCORE_USE_POSIX_MEMALIGN)
294#elif defined(ARCCORE_OS_WIN32)
306 bool is_verbose =
false;
310adjustMemoryCapacity(
size_t wanted_capacity,
size_t element_size,
size_t alignment)
312 if (element_size == 0)
313 return wanted_capacity;
318 size_t block_size = alignment / element_size;
320 return wanted_capacity;
325 size_t nb_element = alignment % element_size;
327 return wanted_capacity;
330 std::cout <<
" wanted_capacity=" << wanted_capacity
331 <<
" element_size=" << element_size
332 <<
" block_size=" << block_size <<
'\n';
335 size_t modulo = wanted_capacity % block_size;
337 wanted_capacity += (block_size - modulo);
339 std::cout <<
" final_wanted_capacity=" << wanted_capacity
340 <<
" modulo=" << modulo <<
'\n';
341 ARCCORE_ASSERT(((wanted_capacity % block_size) == 0), (
"Bad capacity"));
342 return wanted_capacity;
348size_t AlignedMemoryAllocator::
349adjustCapacity(
size_t wanted_capacity,
size_t element_size)
351 return adjustMemoryCapacity(wanted_capacity, element_size, m_alignment);
360 return adjustMemoryCapacity(wanted_capacity, element_size, m_alignment);
369void* PrintableMemoryAllocator::
370allocate(
size_t new_size)
372 void* ptr = Base::allocate(new_size);
373 std::cout <<
"DEF_ARRAY_ALLOCATE new_size=" << new_size <<
" ptr=" << ptr <<
'\n';
380void* PrintableMemoryAllocator::
381reallocate(
void* current_ptr,
size_t new_size)
383 void* ptr = Base::reallocate(current_ptr, new_size);
384 std::cout <<
"DEF_ARRAY_REALLOCATE new_size=" << new_size
385 <<
" current_ptr=" << current_ptr
386 <<
" new_ptr=" << ptr <<
'\n';
393void PrintableMemoryAllocator::
396 std::cout <<
"DEF_ARRAY_DEALLOCATE ptr=" << ptr <<
'\n';
397 Base::deallocate(ptr);
403bool IMemoryAllocator::
431 return x->adjustCapacity(wanted_capacity, element_size);
434size_t IMemoryAllocator::
444bool IMemoryAllocator3::
452 return allocate(MemoryAllocationArgs{}, new_size).baseAddress();
457 return reallocate(MemoryAllocationArgs{},AllocatedMemoryInfo(current_ptr), new_size).baseAddress();
462 deallocate(MemoryAllocationArgs{},AllocatedMemoryInfo(ptr));
464size_t IMemoryAllocator3::
465adjustCapacity(
size_t wanted_capacity,
size_t element_size)
467 return adjustedCapacity(MemoryAllocationArgs{},wanted_capacity, element_size);
469size_t IMemoryAllocator3::
Allocateur mémoire avec alignement mémoire spécifique.
AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size) override
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
void deallocate(MemoryAllocationArgs args, AllocatedMemoryInfo ptr) override
Libère la mémoire dont l'adresse de base est ptr.
AllocatedMemoryInfo allocate(MemoryAllocationArgs args, Int64 new_size) override
Alloue de la mémoire pour new_size octets et retourne le pointeur.
Int64 adjustedCapacity(MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size) const override
Ajuste la capacité suivant la taille d'élément.
Allocateur mémoire avec alignement mémoire spécifique.
bool hasRealloc() const override
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
static constexpr Integer cacheLineAlignment()
Alignement pour une ligne de cache.
Informations sur une zone mémoire allouée.
void * baseAddress() const
Adresse du début de la zone allouée.
Exception lorsqu'un argument est invalide.
AllocatedMemoryInfo reallocate(MemoryAllocationArgs, AllocatedMemoryInfo current_ptr, Int64 new_size) override
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
Int64 adjustedCapacity(MemoryAllocationArgs, Int64 wanted_capacity, Int64 element_size) const override
Ajuste la capacité suivant la taille d'élément.
void deallocate(MemoryAllocationArgs, AllocatedMemoryInfo ptr) override
Libère la mémoire dont l'adresse de base est ptr.
AllocatedMemoryInfo allocate(MemoryAllocationArgs, Int64 new_size) override
Alloue de la mémoire pour new_size octets et retourne le pointeur.
virtual Int64 adjustedCapacity(MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size) const =0
Ajuste la capacité suivant la taille d'élément.
virtual AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size)=0
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
virtual AllocatedMemoryInfo allocate(MemoryAllocationArgs args, Int64 new_size)=0
Alloue de la mémoire pour new_size octets et retourne le pointeur.
virtual void deallocate(MemoryAllocationArgs args, AllocatedMemoryInfo ptr)=0
Libère la mémoire dont l'adresse de base est ptr.
virtual size_t guarantedAlignment(MemoryAllocationArgs args) const =0
Valeur de l'alignement garanti par l'allocateur.
Interface d'un allocateur pour la mémoire.
virtual bool hasRealloc(MemoryAllocationArgs args) const
Indique si l'allocateur supporte la sémantique de realloc.
virtual AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size)
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
virtual void notifyMemoryArgsChanged(MemoryAllocationArgs old_args, MemoryAllocationArgs new_args, AllocatedMemoryInfo ptr)
Notifie du changement des arguments spécifiques à l'instance.
virtual size_t guarantedAlignment(MemoryAllocationArgs args) const
Valeur de l'alignement garanti par l'allocateur.
virtual AllocatedMemoryInfo allocate(MemoryAllocationArgs args, Int64 new_size)
Alloue de la mémoire pour new_size octets et retourne le pointeur.
virtual void deallocate(MemoryAllocationArgs args, AllocatedMemoryInfo ptr)
Libère la mémoire dont l'adresse de base est ptr.
virtual void copyMemory(MemoryAllocationArgs args, AllocatedMemoryInfo destination, AllocatedMemoryInfo source)
Copie la mémoire entre deux zones.
virtual Int64 adjustedCapacity(MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size) const
Ajuste la capacité suivant la taille d'élément.
Classe contenant des informations pour spécialiser les allocations.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Espace de nom de Arccore.
std::int64_t Int64
Type entier signé sur 64 bits.