Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141

Своя реализация malloc, calloc, realloc

10.02.2024, 13:02. Показов 4277. Ответов 44

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Данные функции не работают подскажите в чем может быть дело. UB необработанные исключения и прочее в зависимости от фазы луны.
Походу я где-то туплю. Заранее благодарен за помощь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static constexpr void * xmalloc(size_type nmemb, size_type size)
{    
        size_type new_size = nmemb * size;  
        if ((new_size == 0 ) || ((SIZE_MAX / nmemb) < size) || !(_HEAP_MAXREQ > new_size)) [[unlikely]] {return nullptr; }      
        return _malloca(new_size);
}
static constexpr void * xcalloc(size_type nmemb, size_type size)
{    
        void * newptr = xmalloc(nmemb, size);
        if(newptr)[[likely]]{
            size_type new_size = nmemb * size;
            memset(newptr, 0 , new_size);
            return newptr;
        }else return nullptr;
        
}
static constexpr void * xrealloc(void * ptr, size_type nmemb, size_type size)
{assert(ptr);
        void * newptr = xmalloc(nmemb, size);
        if(newptr)[[likely]]{
            if (newptr != ptr) {
                size_type new_size = nmemb * size;
                memcpy(newptr, ptr, new_size);
                return newptr;
            }return ptr;
        }else return nullptr;
}
 
***
где-то в конце _freea(buf)
так выглядит реализация в библиотеке malloc.h как видно из кода если запрашиваемый размер больше _ALLOCA_S_THRESHOLD выделение должно происходить в куче.
C++
1
2
3
4
5
6
7
8
    #undef _malloca
    #define _malloca(size)                                                                 \
        __pragma(warning(suppress: 6255 6386))                                             \
        (_MallocaComputeSize(size) != 0                                                    \
            ? (((_MallocaComputeSize(size) <= _ALLOCA_S_THRESHOLD)                         \
                ? _MarkAllocaS(_alloca(_MallocaComputeSize(size)), _ALLOCA_S_STACK_MARKER) \
                : _MarkAllocaS(malloc(_MallocaComputeSize(size)), _ALLOCA_S_HEAP_MARKER))) \
            : NULL)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2024, 13:02
Ответы с готовыми решениями:

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают...

Использование calloc/realloc/free
//calloc.cpp //Использование calloc #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;locale&gt; using...

44
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
12.02.2024, 12:28
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы, очевидно, перепутали _malloca с _alloca. Внимательнее надо...
Мог и перепутать, а могли и вы, прекращайте сурдоперевод читать.
https://learn.microsoft.com/en... w=msvc-170
Allocates memory on the stack. This function is a version of _alloca with security enhancements as described in Security features in the CRT.
Добавлено через 58 секунд
Тут больше вопрос к автору, откуда у него этот огрызок?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
12.02.2024, 12:43
Цитата Сообщение от SmallEvil Посмотреть сообщение
Allocates memory on the stack.
Во-первых, ну так читайте дальше. Там все дальше объясняется. То есть по вашей же ссылке дальше фактически написано, что первые строки со страницы MSDN, которые вы процитировали - вранье (скорее всего копипаста со страницы _alloca, которую забыли исправить), и все на самом все работает совсем не так.

Во-вторых, мое описание поведения этого макроса в #14 основано на исходном тексте этого макроса, приведенного в вопросе, а не на MSDN. То есть что там написано в MSDN уже никакой роли не играет. О каком "MSDN" может вообще идти речь, когда я уже сказал свое слово? (Когда я писал #14, я еще даже и не знал, что это майкрософтовский макрос.)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
12.02.2024, 13:47
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
я еще даже и не знал, что это майкрософтовский макрос
Почему вы решили что это майкросфотский макрос ? (тот что представлен в огрызке кода автором сего безобразия )
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
12.02.2024, 14:37  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему вы решили что это майкросфотский макрос ? (тот что представлен в огрызке кода автором сего безобразия )
я отправил замечание администрации за повторные оскорбления к вашему сведению. И если не уверены в чем то не пишите это. А предоставленный макрос входит в состав стандартной библиотеки
вот заберите свои слова назад:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//
// malloc.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// The memory allocation library.
//
#pragma once
#ifndef _INC_MALLOC // include guard for 3rd party interop
#define _INC_MALLOC
 
#include <corecrt.h>
#include <corecrt_malloc.h>
***
 
 
 
#ifdef _DEBUG
// C6255: _alloca indicates failure by raising a stack overflow exception
// C6386: buffer overrun
    #ifndef _CRTDBG_MAP_ALLOC
        #undef _malloca
        #define _malloca(size)                                                           \
            __pragma(warning(suppress: 6255 6386))                                       \
            (_MallocaComputeSize(size) != 0                                              \
                ? _MarkAllocaS(malloc(_MallocaComputeSize(size)), _ALLOCA_S_HEAP_MARKER) \
                : NULL)
    #endif
 
#else
 
    #undef _malloca
    #define _malloca(size)                                                                 \
        __pragma(warning(suppress: 6255 6386))                                             \
        (_MallocaComputeSize(size) != 0                                                    \
            ? (((_MallocaComputeSize(size) <= _ALLOCA_S_THRESHOLD)                         \
                ? _MarkAllocaS(_alloca(_MallocaComputeSize(size)), _ALLOCA_S_STACK_MARKER) \
                : _MarkAllocaS(malloc(_MallocaComputeSize(size)), _ALLOCA_S_HEAP_MARKER))) \
            : NULL)
 
#endif
***
Это первое.
Второе на форуме задаются вопросы если есть необходимость в помощи а свое мнение держите при себе
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
12.02.2024, 15:24
Цитата Сообщение от Signum7 Посмотреть сообщение
предоставленный макрос входит в состав стандартной библиотеки
Какого компилятора ?
И без ТЗ (технического задания) вам никто не поможет.
Цитата Сообщение от Signum7 Посмотреть сообщение
я отправил замечание администрации за повторные оскорбления
отправляй их хоть 100500, и фото моё пришли )
зюыю и мне сообщи, я буду очень рад

Добавлено через 1 минуту
Signum7,

Не по теме:

Ах да, мнение своё держи при себе

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
12.02.2024, 19:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему вы решили что это майкросфотский макрос ? (тот что представлен в огрызке кода автором сего безобразия )
Просто взял и посмотрел определение в майкрософтовских исходниках. В чем сложность?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
12.02.2024, 20:44
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
майкрософтовских исходниках
а я думал, что у них закрытый код

Добавлено через 28 секунд
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
определение
ааа, теперь ясно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
12.02.2024, 20:55
Цитата Сообщение от Royal_X Посмотреть сообщение
а я думал, что у них закрытый код
Во-первых, код стандартной библиотеки у Майкрософт никакой не закрытый. Ставьте на здоровье исходники и отладочную информацию и смотрите сколько угодно, хоть глазами, хоть дебаггером.

Во-вторых, а что такое вообще "закрытый код" в языковой библиотеке С++? Ну, допустим, саму библиотеку можно поставлять в откомпилированном виде, но заголовочные файлы-то никак "закрыть" не получится. Соответственно то, что должно определяться в заголовочных файлах - макросы, шаблоны, инлайны и т.п. - всегда будет открытым. Понятно, что теоретически стандартные заголовки - это не файлы, а что угодно, но в реальной жизни-то все по-прежнему реализуется обычными файлами.

В данном случае мы имеем дело с макросом. Как можно "закрыть" макрос?
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
14.02.2024, 17:30  [ТС]
немного подумав решил сделать простейший аллокатор памяти, если запрашиваемый размер меньше определенного размера используется массив байт в противном случае используется куча. вот пример класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
constexpr auto MEM = 64 * 1024;
 
    template <class T = char> 
constexpr   size_t  truncate = static_cast<size_t>(-1) / sizeof(T);
 
    template <class T = char> 
constexpr  size_t t_size = sizeof(T);
 
constexpr enum alloc_err
{
    err_s = -1,
    err_allocate = 1,
    allocate_ok = 0
};
 
******
size_type test_size(size_type nmemb, size_type size = t_size<value_type>)
{
    size_type new_size = nmemb * size;  
    if ((new_size == 0 ) || ((SIZE_MAX / nmemb) < size) || !(_HEAP_MAXREQ > new_size)) [[unlikely]] {xalloc.error = err_allocate; return 0; } 
        return new_size;
}
 
*******
 private:
struct alloc
{
    std::atomic<size_type>      alloc_capacity{0U}; /* Емкость аллокатора байт */
    std::atomic<size_type>      alloc_size{0U}; /* Размер выделенной памяти байт */
    std::atomic<size_type>      alloc_free{0U}; /* Доступно байт */
    std::atomic<pointer>        freeptr{nullptr}; /* Указатель на свободную область */
    std::atomic<bool>           array_f{true}; /* Флаг типа памяти */
    std::atomic<alloc_err>      error{err_s}; /* флаги  */
 
    alloc() noexcept = default; 
 
 
private:
void clear() noexcept {
            alloc_capacity = 0U;
            alloc_size = 0U;
            alloc_free = 0U;
            freeptr = nullptr;
            array_f = true;
            error = err_s;
        }
}xalloc;
 
    pointer         newptr{nullptr};
 
    static const auto   size_mem_buf = (MEM < truncate<value_type> ? MEM : truncate<value_type>);
 
    array<value_type,   size_mem_buf> buffer{};
 
    custom_alloc(void)                              noexcept = default;     
    
    custom_alloc( custom_alloc&)                    noexcept = delete;
    custom_alloc( const custom_alloc&)              noexcept = delete;  
    custom_alloc( custom_alloc&&)                   noexcept = delete;
 
    custom_alloc &operator = ( const custom_alloc&) noexcept = delete;
    custom_alloc &operator = ( custom_alloc&&)      noexcept = delete;
 
    ~custom_alloc()                                 noexcept {xfree(); }
    void xfree(void)
    {
        if(!xalloc.array_f)free(newptr);        
    }
               
public:
static custom_alloc& instance() noexcept{ static custom_alloc s; return s; }
******
и кастомный метод xmalloc:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
pointer xmalloc(size_type nmemb, size_type size = t_size<value_type>)noexcept
{       
    size_type new_size = test_size (nmemb , size);  if(xalloc.error == err_allocate)[[unlikely]]{ return nullptr; }
    
    if(xalloc.error == err_s)
    {
        xalloc.alloc_capacity = size_mem_buf;
        xalloc.alloc_free = size_mem_buf;       
    }
    if (new_size < xalloc.alloc_free)[[likely]]
    {   
        xalloc.alloc_free -= new_size;
        if (xalloc.freeptr == nullptr)[[unlikely]]
        {
            xalloc.freeptr = buffer.ptr();          
        }       
            newptr = xalloc.freeptr;
            xalloc.freeptr += new_size;
            xalloc.alloc_size = new_size;
            xalloc.array_f = true;
            xalloc.error = allocate_ok;
    }
    else {
        if ((newptr = reinterpret_cast<pointer> (malloc(new_size))) != nullptr)[[likely]]{
            xalloc.array_f = false;
            xalloc.error = allocate_ok;
            
        }else {xalloc.error = err_allocate; return nullptr;}
    }   
return newptr;
        
}
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 898
14.02.2024, 21:02
Цитата Сообщение от Signum7 Посмотреть сообщение
немного подумав решил сделать простейший аллокатор памяти
От нас требуется критика или потестить ?
Или мысли какие по этому поводу высказать ?
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
14.02.2024, 22:21  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
От нас требуется критика или потестить ?
Или мысли какие по этому поводу высказать ?
Буду благодарен за все, что сможет сказать сообщество
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
14.02.2024, 22:43
Цитата Сообщение от Signum7 Посмотреть сообщение
Буду благодарен за все, что сможет сказать сообщество
Говорю: этот какой-то огрызок кода без конца и без начала. Что тут к чему - в упор не ясно.
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
14.02.2024, 23:15  [ТС]
полный вариант тестового класса он не доделан пока
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <cassert>
#include <iostream>
 
#include <limits>
#include <cstddef>
 
#include <memory>
 
 template<class T, size_t elements > 
class array
{
public:  
 
    size_t  num() const
    {
        return elements;
    }
 
   
    size_t  byte_size() const
    {
        return sizeof(arr);
    }
    void    zero()
    {
        memset(arr, 0, sizeof(arr));
    }
    const T& operator[](size_t index) const
    {
        assert(index < elements);
        return arr[index];
    }
    T& operator[](size_t index)
    {
        assert(index < elements);
        return arr[index];
    }
    const T* ptr() const
    {
        p = arr;
        return p;
    }
    T* ptr()
    {
        p = arr;
        return p;
    }
    array() = default;
~array(){ if(p)p = nullptr; }
private:
    T  arr[elements]{} ;
    T* p{nullptr};
    
 
};
 
constexpr auto MEM = 64 * 1024;
 
    template <class T = char> 
constexpr   size_t  truncate = static_cast<size_t>(-1) / sizeof(T);
 
    template <class T = char> 
constexpr  size_t t_size = sizeof(T);
 
template<typename T>struct RemoveConst{typedef T value_type;};
template<typename T>struct RemoveConst<const T>{ typedef T value_type;};
 
constexpr enum alloc_err
{
    err_s = -1,
    err_allocate = 1,
    allocate_ok = 0
};
 
class custom_alloc {
public:
    // type definitions
                  
    using Base              = RemoveConst<unsigned char>;       
    using value_type        = typename Base::value_type;
    using pointer           =       value_type* ;
    using const_pointer     = const value_type* ;              
    using reference         =       value_type&;      
    using const_reference   = const value_type&;               
    using size_type         = std::size_t ; 
    using difference_type   = std::ptrdiff_t;
 
 
 private:
struct alloc
{
    std::atomic<size_type>      alloc_capacity{0U}; /* Емкость аллокатора байт */
    std::atomic<size_type>      alloc_size{0U}; /* Размер выделенной памяти байт */
    std::atomic<size_type>      alloc_free{0U}; /* Доступно байт */
    std::atomic<pointer>        freeptr{nullptr}; /* Указатель на свободную область */
    std::atomic<bool>           array_f{true}; /* Флаг типа памяти */
    std::atomic<alloc_err>      error{err_s}; /* флаги  */
 
    alloc() noexcept = default; 
 
 
private:
void clear() noexcept {
            alloc_capacity = 0U;
            alloc_size = 0U;
            alloc_free = 0U;
            freeptr = nullptr;
            array_f = true;
            error = err_s;
        }
}xalloc;
 
    pointer         newptr{nullptr};
 
    static const auto   size_mem_buf = (MEM < truncate<value_type> ? MEM : truncate<value_type>);
 
    array<value_type,   size_mem_buf> buffer{};
 
    custom_alloc(void)                              noexcept = default;     
    
    custom_alloc( custom_alloc&)                    noexcept = delete;
    custom_alloc( const custom_alloc&)              noexcept = delete;  
    custom_alloc( custom_alloc&&)                   noexcept = delete;
 
    custom_alloc &operator = ( const custom_alloc&) noexcept = delete;
    custom_alloc &operator = ( custom_alloc&&)      noexcept = delete;
 
    ~custom_alloc()                                 noexcept {xfree(); }
    void xfree(void)
    {
        if(!xalloc.array_f)free(newptr);        
    }
               
public:
static custom_alloc& instance() noexcept{ static custom_alloc s; return s; }
       
 
pointer xmalloc(size_type nmemb, size_type size = t_size<value_type>)noexcept
{       
    size_type new_size = test_size (nmemb , size);  if(xalloc.error == err_allocate)[[unlikely]]{ return nullptr; } 
    
    if(xalloc.error == err_s)
    {
        xalloc.alloc_capacity = size_mem_buf;
        xalloc.alloc_free = size_mem_buf;       
    }
    if (new_size < xalloc.alloc_free)[[likely]]
    {   
        xalloc.alloc_free -= new_size;
        if (xalloc.freeptr == nullptr)[[unlikely]]
        {
            xalloc.freeptr = buffer.ptr();          
        }       
            newptr = xalloc.freeptr;
            xalloc.freeptr += new_size;
            xalloc.alloc_size = new_size;
            xalloc.array_f = true;
            xalloc.error = allocate_ok;
    }
    else {
        if ((newptr = reinterpret_cast<pointer> (malloc(new_size))) != nullptr)[[likely]]{
            xalloc.array_f = false;
            xalloc.error = allocate_ok;
            
        }else {xalloc.error = err_allocate; return nullptr;}
    }   
return newptr;
        
}
 
 pointer xcalloc(size_type nmemb, size_type size = t_size<value_type>) noexcept{ return newptr; }
    
pointer xrealloc(pointer ptr, size_type nmemb, size_type size = t_size<value_type>) noexcept { return newptr; }
 
private:
 
size_type test_size(size_type nmemb, size_type size = t_size<value_type>)
{
    size_type new_size = nmemb * size;  
    if ((new_size == 0 ) || ((SIZE_MAX / nmemb) < size) || !(_HEAP_MAXREQ > new_size)) [[unlikely]] {xalloc.error = err_allocate; return 0; } 
        return new_size;
}
 
};
#define  x_alloc custom_alloc::instance()
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 898
14.02.2024, 23:21
вот мысли вслух:
1) непонятно какая задача решалась - вы смешали обычный линейный аллокатор и обёртку для malloc.
притом совершенно непонятно как работающую. И это самая большая проблема этого кода.
даже складывается ощущение что этот код для проверки знаний студентов - дескать расскажите что он делает.

сразу скажу логику работы даже не смотрел - ибо непонимаю как это должно работать.
остальное - мелочи что режут глаз:

2)отсутствует выравниваение результата - соответственно если в выделенную в массиве память будут писать simd инструкции то будет fatal error )) и ловить это очень трудно и неудобно.

3)зачем std::atomic ? если вы делаете
Цитата Сообщение от Signum7 Посмотреть сообщение
C++
1
2
newptr = xalloc.freeptr;
 xalloc.freeptr += new_size;
а надо fetch_add
хотите в многопоток но пока неумеете - поэтому не нужен он тут сейчас.
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
15.02.2024, 11:44  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
а надо fetch_add
А разве операторы там не перегружены?
переписал так, правильно ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pointer xmalloc(size_type nmemb, size_type size = t_size<value_type>)noexcept
{       
    size_type new_size = test_size (nmemb , size);  if(xalloc.error.load() == err_allocate) [[unlikely]] { return nullptr; }
    
    if(xalloc.error.load() == err_s)
    {
        xalloc.alloc_capacity.store(size_mem_buf);
        xalloc.alloc_free.store(size_mem_buf);
    }
    if (new_size < xalloc.alloc_free.load())[[likely]]
    {   
        xalloc.alloc_free.fetch_sub(new_size);
        if (xalloc.freeptr.load() == nullptr) [[unlikely]]
        {
            xalloc.freeptr.store(buffer.ptr());
        }       
            newptr = xalloc.freeptr.load();
            xalloc.freeptr.fetch_add(new_size);
            xalloc.alloc_size.store(new_size);
            xalloc.array_f.store(true);
            xalloc.error.store(allocate_ok);
    }
    else {
        if ((newptr = reinterpret_cast<pointer> (malloc(new_size))) != nullptr)[[likely]]{
            xalloc.array_f.store(false);
            xalloc.error.store(allocate_ok);
            
        }else {xalloc.error.store(err_allocate); return nullptr; }
    }   
return newptr;      
}
Добавлено через 3 минуты
Цитата Сообщение от Aledveu Посмотреть сообщение
1) непонятно какая задача решалась - вы смешали обычный линейный аллокатор и обёртку для malloc.
идея в том чтобы использовать линейный аллокатор пока есть место в буфере и только потом задействовать кучу. пока еще правда не придумал как правильно делать деаллокейт но это в процессе.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.02.2024, 14:11
Цитата Сообщение от Signum7 Посмотреть сообщение
идея в том чтобы использовать линейный аллокатор пока есть место в буфере и только потом задействовать кучу. пока еще правда не придумал как правильно делать деаллокейт но это в процессе.
Так у тебя всё в куче. Разве что вы припрятали где у вас на стеке зарезервирована память ?
По итогу, масло маслянное, вода мокрая, а твой код непотребство...

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Разве что вы припрятали где у вас на стеке зарезервирована память ?
Ну ладно, просмотрел.
Ну обратно, к чему этот аллокатор ?
Его практическое использование - нулевое.
Что бы правильно выбирать подобные аллокаторы и их использовать, одни из методов, использовать полиморфизм, что, как мы знаем, понижает производительность. То есть для подобного аллокатора нужно не только желание его создать, но также и аргмуентация, которую мы не увидели.
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
15.02.2024, 14:12  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так у тебя всё в куче.
с какой радости в куче ?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.02.2024, 14:16
Цитата Сообщение от Signum7 Посмотреть сообщение
с какой радости в куче ?
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну ладно, просмотрел.
Все остальные вопросы отпадают, пока не будет четкой задачи которую решает этот аллокатор.
Потому что ваш код - ужасен, сам по себе.
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
15.02.2024, 14:17  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну обратно, к чему этот аллокатор ?
по итогу хочу сравнить скорость работы на куче и на статическом массиве. если получется использую в другом своем проекте где много выделений памяти

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому что ваш код - ужасен,
и что в нем ужасного?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.02.2024, 14:30
Цитата Сообщение от Signum7 Посмотреть сообщение
по итогу хочу сравнить скорость работы на куче и на статическом массиве. если получется использую в другом своем проекте где много выделений памяти
Работу памяти ?
Так а зачем для этого аллокатор ???

Цитата Сообщение от Signum7 Посмотреть сообщение
и что в нем ужасного?
По порядку :
- Форматирование кода.
- явные использования constexp без понимания что это и для чего он нужен.
- Про атомарики вам уже сказали.
C++
1
array<value_type,   size_mem_buf> buffer{};
Это же ваш класс, не std:: ?
Тогда мы имеем бесконечную рекурсию. Нет?

Цитата Сообщение от Signum7 Посмотреть сообщение
}xalloc;
Это вообще ужас из прошлых веков и стиля Object Pascal /^ мелкомягкий извращенцев.

Там ещё много подобного, не только стиль, вы создаете путанный код, потом в нем путаетесь.
Как бы специально загоняете себя в беличье колесо...

Добавлено через 2 минуты
Цитата Сообщение от Signum7 Посмотреть сообщение
в другом своем проекте где много выделений памяти
Тут нужно понимать, сколько это "много", и какого именно "выделения"(размеры + частота) памяти идется.
Без предварительного анализа пытаться делать подобную оптимизация - не имеет смысла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2024, 14:30

malloc vs. calloc
Когда стоит использовать malloc , а когда calloc?

calloc vs malloc
Объясните,пжлста,чем отличается malloc oт calloc?

Malloc / calloc
здравствуйте. Интересует такой вопрос : динамическая память. Когда мы выделяем память при помощи функции malloc то нас в универе учат...

Как string создает строку?(calloc, malloc)
стринг создает строку с помощью calloc, malloc?

malloc, realloc
У меня задан одномерный динамический массив таким образом: int *m1=new int; //n-количество элементов, вводится пользователем Далее этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru