Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SmallArray.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* SmallArray.cc (C) 2000-2025 */
9/* */
10/* Tableau 1D de données avec buffer pré-alloué. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/SmallArray.h"
15#include "arcane/utils/FatalErrorException.h"
16
17#include <cstdlib>
18#include <cstring>
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane::Impl
24{
25
26namespace
27{
29 const bool is_verbose = false;
30} // namespace
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35void* StackMemoryAllocator::
36_allocateMemory(Int64 new_size)
37{
38 if (is_verbose)
39 std::cout << "ALLOCATE: use malloc s=" << new_size << "\n";
40 void* ptr = std::malloc(new_size);
41 if (!ptr)
42 ARCANE_FATAL("Can not allocated memory for size '{0}'", new_size);
43 return ptr;
44}
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
51{
52 void* current_ptr = current_ptr_info.baseAddress();
53 if (current_ptr != m_preallocated_buffer) {
54 if (new_size < m_preallocated_size) {
55 // On passe d'un pointeur alloué vers notre buffer interne.
56 // Il faut recopier les valeurs. On ne connait pas exactement
57 // la taille de 'current_ptr' mais on est certain qu'elle est
58 // supérieure à 'm_preallocated_size' donc à 'new_size'.
59 // On ne recopie donc que ces valeurs là
60 if (is_verbose)
61 std::cout << "REALLOCATE: use own buffer from realloc s=" << new_size << "\n";
62 std::memcpy(m_preallocated_buffer, current_ptr, new_size);
63 std::free(current_ptr);
64 return { m_preallocated_buffer, new_size };
65 }
66 if (is_verbose)
67 std::cout << "REALLOCATE: use realloc s=" << new_size << "\n";
68 return { std::realloc(current_ptr, new_size), new_size };
69 }
70
71 if (new_size <= m_preallocated_size) {
72 if (is_verbose)
73 std::cout << "REALLOCATE: use buffer because small size s=" << new_size << "\n";
74 return { m_preallocated_buffer, new_size };
75 }
76
77 // Il faut allouer et recopier depuis le buffer pré-alloué.
78 if (is_verbose)
79 std::cout << "REALLOCATE: use malloc and copy s=" << new_size << "\n";
80 void* new_ptr = std::malloc(new_size);
81 std::memcpy(new_ptr, m_preallocated_buffer, m_preallocated_size);
82 return { new_ptr, new_size };
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88void StackMemoryAllocator::
89_freeMemory(void* ptr)
90{
91 std::free(ptr);
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97} // namespace Arcane::impl
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations sur une zone mémoire allouée.
void * baseAddress() const
Adresse du début de la zone allouée.
AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size) final
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
Definition SmallArray.cc:50
Classe contenant des informations pour spécialiser les allocations.
std::int64_t Int64
Type entier signé sur 64 bits.