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

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

10.02.2024, 13:02. Показов 3762. Ответов 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
Заблокирован
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
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
12.02.2024, 12:43
Цитата Сообщение от SmallEvil Посмотреть сообщение
Allocates memory on the stack.
Во-первых, ну так читайте дальше. Там все дальше объясняется. То есть по вашей же ссылке дальше фактически написано, что первые строки со страницы MSDN, которые вы процитировали - вранье (скорее всего копипаста со страницы _alloca, которую забыли исправить), и все на самом все работает совсем не так.

Во-вторых, мое описание поведения этого макроса в #14 основано на исходном тексте этого макроса, приведенного в вопросе, а не на MSDN. То есть что там написано в MSDN уже никакой роли не играет. О каком "MSDN" может вообще идти речь, когда я уже сказал свое слово? (Когда я писал #14, я еще даже и не знал, что это майкрософтовский макрос.)
0
Заблокирован
12.02.2024, 13:47
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
я еще даже и не знал, что это майкрософтовский макрос
Почему вы решили что это майкросфотский макрос ? (тот что представлен в огрызке кода автором сего безобразия )
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 133
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
Заблокирован
12.02.2024, 15:24
Цитата Сообщение от Signum7 Посмотреть сообщение
предоставленный макрос входит в состав стандартной библиотеки
Какого компилятора ?
И без ТЗ (технического задания) вам никто не поможет.
Цитата Сообщение от Signum7 Посмотреть сообщение
я отправил замечание администрации за повторные оскорбления
отправляй их хоть 100500, и фото моё пришли )
зюыю и мне сообщи, я буду очень рад

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

Не по теме:

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

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
12.02.2024, 19:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему вы решили что это майкросфотский макрос ? (тот что представлен в огрызке кода автором сего безобразия )
Просто взял и посмотрел определение в майкрософтовских исходниках. В чем сложность?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6130 / 2825 / 1038
Регистрация: 01.06.2021
Сообщений: 10,300
12.02.2024, 20:44
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
майкрософтовских исходниках
а я думал, что у них закрытый код

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

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

В данном случае мы имеем дело с макросом. Как можно "закрыть" макрос?
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 133
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
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
14.02.2024, 21:02
Цитата Сообщение от Signum7 Посмотреть сообщение
немного подумав решил сделать простейший аллокатор памяти
От нас требуется критика или потестить ?
Или мысли какие по этому поводу высказать ?
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 133
14.02.2024, 22:21  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
От нас требуется критика или потестить ?
Или мысли какие по этому поводу высказать ?
Буду благодарен за все, что сможет сказать сообщество
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
14.02.2024, 22:43
Цитата Сообщение от Signum7 Посмотреть сообщение
Буду благодарен за все, что сможет сказать сообщество
Говорю: этот какой-то огрызок кода без конца и без начала. Что тут к чему - в упор не ясно.
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 133
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
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 862
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
Сообщений: 133
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
Заблокирован
15.02.2024, 14:11
Цитата Сообщение от Signum7 Посмотреть сообщение
идея в том чтобы использовать линейный аллокатор пока есть место в буфере и только потом задействовать кучу. пока еще правда не придумал как правильно делать деаллокейт но это в процессе.
Так у тебя всё в куче. Разве что вы припрятали где у вас на стеке зарезервирована память ?
По итогу, масло маслянное, вода мокрая, а твой код непотребство...

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

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому что ваш код - ужасен,
и что в нем ужасного?
0
Заблокирован
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru