Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Как написать функцию выделения памяти?

18.08.2020, 01:51. Показов 7901. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько сложно это сделать? Покажите примитивный механизм поиска памяти, как вариант мне даже интересно посмотреть как работают известные функции(new maloc caloc), я читал что по принципу сборщика мусора но механизмов реализации не видел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2020, 01:51
Ответы с готовыми решениями:

Как написать программу для динамического выделения памяти с использованием new
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Передача массива указателей в функцию для выделения памяти
Есть функция, в которую передаются массивы указателей, для выделения памяти. void str_malloc(char** &strBol,char**...

Создать функцию для выделения памяти под двумерный массив
1. C++ Создать функцию для выделения памяти под двумерный массив.

76
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
01.10.2020, 21:39  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от politoto Посмотреть сообщение
И окажется, что в системе нет всех этих brk/sbrk/break полувековой давности.
Я читал что память просится в разделе Data... и BSS. Мне интересно в каких разделах ещё можно просить память? А также можно ли просить память в этих разделах из с++?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
03.10.2020, 01:14  [ТС]
Что-то тихо очень бы хотелось узнать ответ на свой вопрос.
0
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
03.10.2020, 05:25
Для начала почитай как работает стэк в ассемблере. Если тебе сложно понять ассемблер, то используй готовые менеджеры памяти, которые тебя сделают Аки Царём быстрого прогресса. Потому что хернёй не будешь страдать. Данные сами выделяются, ты указываешь какое выравнивание хочешь, и прочее.
А оно тебе даёт. Прям как Наташка с первого подъезда.

Добавлено через 23 минуты
В общем, что бы понять как взаимодействовать с оперативной памятью. Надо почитать как взаимодействовать с оперативной памятью на ассемблере. И заодно там уже будут понятия как вообще данная память выделяется.

Как процессор взаимодействует с оперативной памятью, и прочее.


А вот вся эта поверхностная лабуда с примитивными примерами - херня чистой воды
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 07:08
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я читал что память просится в разделе Data... и BSS.
Мне интересно в каких разделах ещё можно просить память?
Где читали, если не секрет?
BSS - это директива или псевдоинструкция одного из древних ассемблеров.
По смыслу близкая к чему-то вроде
Assembler
1
data_at_bss     resb 10
И что там понимается под разделами?
Эти разделы (a.k.a. программные секции), которые компилятор создаёт в объетных модулях, поступающих на вход компоновщика?
Bash
1
readelf -lh /sbin/ldconfig.real
Code
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
Заголовок ELF:
  Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 
  Класс:                             ELF64
  Данные:                            дополнение до 2, little endian
  Версия:                            1 (current)
  OS/ABI:                            UNIX - GNU
  Версия ABI:                        0
  Тип:                               EXEC (Исполняемый файл)
  Машина:                            Advanced Micro Devices X86-64
  Версия:                            0x1
  Адрес точки входа:               0x400e60
  Начало заголовков программы:          64 (байт в файле)
  Начало заголовков программы:          994528 (байт в файле)
  Флаги:                             0x0
  Размер этого заголовка:            64 (байт)
  Размер заголовков программы:       56 (байт)
  Число заголовков программы:        6
  Размер заголовков раздела:         64 (байт)
  Число заголовков раздела:          31
  Индекс табл. строк загол. раздела: 30
 
Заголовки программы:
  Тип            Смещ.              Вирт.адр           Физ.адр
                 Рзм.фйл            Рзм.пм              Флаги  Выравн
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000ef6dd 0x00000000000ef6dd  R E    200000
  LOAD           0x00000000000efeb0 0x00000000006efeb0 0x00000000006efeb0
                 0x0000000000001d84 0x0000000000004148  RW     200000
  NOTE           0x0000000000000190 0x0000000000400190 0x0000000000400190
                 0x0000000000000044 0x0000000000000044  R      4
  TLS            0x00000000000efeb0 0x00000000006efeb0 0x00000000006efeb0
                 0x0000000000000028 0x0000000000000058  R      8
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x00000000000efeb0 0x00000000006efeb0 0x00000000006efeb0
                 0x0000000000000150 0x0000000000000150  R      1
 
 Соответствие раздел-сегмент:
  Сегмент Разделы...
   00     .note.ABI-tag .note.gnu.build-id .rela.plt .init .plt .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit .stapsdt.base __libc_thread_subfreeres .eh_frame .gcc_except_table 
   01     .tdata .init_array .fini_array .jcr .data.rel.ro .got .got.plt .data .bss __libc_freeres_ptrs 
   02     .note.ABI-tag .note.gnu.build-id 
   03     .tdata .tbss 
   04     
   05     .tdata .init_array .fini_array .jcr .data.rel.ro .got
А также можно ли просить память в этих разделах из с++?
Использовать в с++ память для новых объектов в области, в которой были размещены другие объекты можно с помощью одного из вариантов new expression.
https://en.cppreference.com/w/cpp/language/new
https://ru.cppreference.com/w/cpp/language/new
https://ru.coursera.org/lectur... -new-jSggV
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
#include <iostream>
#include <new>
#include <cstddef>
 
// где-то когда-то
alignas(double) char BSS[1000]; 
 
alignas(double) int  values[ ]{ 1, 2, 3, 4, 5, 6, 7, 8 };
 
alignas(double) const std::int64_t cvalues{ 1ll << (64 - 2), }; 
 
int 
main()
{
    const auto 
        newd { new(reinterpret_cast<void*>(&main))  double, }, // плохо!
        newc { new(const_cast<std::int64_t*>(&cvalues))     double, } // в области для инициализированных констант
        ;
 
        auto 
        // в области для инициализированных int
        initialized { new(values)   double{7.6543,} }, 
        // в области для неинициализированных char
        uninitialized { new(BSS)    double{6.543e-3,} }; 
 
    
    std::cout 
        << *newd << " at " << newd << '\n' 
        << *newc << " at " << newc << '\n' 
        << *initialized << " at " << initialized << '\n' 
        << *uninitialized << " at " << uninitialized << '\n' 
    ;
 
}
Bash
1
2
 g++ newm.c++  -std=c++14
./a.out
Code
1
2
3
4
7.40463e+97 at 0x400886
2 at 0x400b20
7.6543 at 0x601068
0.006543 at 0x6011b8
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 07:21

Не по теме:

Цитата Сообщение от Ligren Посмотреть сообщение
Для начала почитай как работает стэк в ассемблере.
В ассемблере стек, если он конечно есть, работает так же, как и в любой другой программе.



Добавлено через 11 минут
В C++ нет никаких "разделов". Но они могут быть в системе, в которой разрабатывается, собирается или выполняется разрабатываемая программа.
0
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
03.10.2020, 18:57
Цитата Сообщение от politoto Посмотреть сообщение
нет никаких
Всё есть, ты запросто можешь в c++ писать ассемблерными вставками.

Я это написал к тому что, что бы понять как память вообще выделяется на низкоуровневых языках.


Ладно, напросились. Будем с вами как с маленькими. Обычно, память выделяет система. Так как система закрытая у нас - Windows то мы на неё сразу забьём.

Какая у нас система не закрытая ? Ага! Linux вот вам ваша sbrk

Она в свою очередь использует Ассемблерные вставки
Кликните здесь для просмотра всего текста
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
#if defined(__x86_64__)
#define my_syscall1(num, arg1)                                                \
({                                                                            \
    long _ret;                                                            \
    register long _num  asm("rax") = (num);                               \
    register long _arg1 asm("rdi") = (long)(arg1);                        \
                                          \
    asm volatile (                                                        \
        "syscall\n"                                                   \
        : "=a" (_ret)                                                 \
        : "r"(_arg1),                                                 \
          "0"(_num)                                                   \
        : "rcx", "r8", "r9", "r10", "r11", "memory", "cc"             \
    );                                                                    \
    _ret;                                                                 \
})
 
#elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__)
 
#define my_syscall1(num, arg1)                                                \
({                                                                            \
    long _ret;                                                            \
    register long _num asm("eax") = (num);                                \
    register long _arg1 asm("ebx") = (long)(arg1);                        \
                                          \
    asm volatile (                                                        \
        "int $0x80\n"                                                 \
        : "=a" (_ret)                                                 \
        : "r"(_arg1),                                                 \
          "0"(_num)                                                   \
        : "memory", "cc"                                              \
    );                                                                    \
    _ret;                                                                 \
})



То есть по простому, исходя из __i386__ платформы, мы можем понять что выделение идёт как
C++
1
2
3
4
5
        push    rbx
        mov     eax, 214
        mov     rbx, rdi
        int $0x80
        pop     rbx

Вот и сказочки конец.

Добавлено через 6 минут
Я сразу скинул ссылку на основную функцию. Но что бы не было ещё вопросов

C++
1
2
3
4
5
6
7
8
9
10
11
12
static __attribute__((unused))
void *sbrk(intptr_t inc)
{
    void *ret;
 
    /* first call to find current end */
    if ((ret = sys_brk(0)) && (sys_brk(ret + inc) == ret + inc))
        return ret + inc;
 
    SET_ERRNO(ENOMEM);
    return (void *)-1;
}
Добавлено через 16 минут
Ну а теперь давайте про malloc. Раз уж дело пошло.

https://github.com/torvalds/li... s/mm.h#L34

Кликните здесь для просмотра всего текста
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
static void *malloc(int size)
{
    void *p;
 
    if (size < 0)
        return NULL;
    if (!malloc_ptr)
        malloc_ptr = free_mem_ptr;
 
    malloc_ptr = (malloc_ptr + 3) & ~3;     /* Align */
 
    p = (void *)malloc_ptr;
    malloc_ptr += size;
 
    if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
        return NULL;
 
    malloc_count++;
    return p;
}
 
static void free(void *where)
{
    malloc_count--;
    if (!malloc_count)
        malloc_ptr = free_mem_ptr;
}
https://github.com/torvalds/li... s/mm.h#L34


О многом не говорит. Но если мы взглянем на ассемблер данной функции, то тут всё очевидно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
malloc(int):
        test    edi, edi
        js      .L3
        mov     rax, QWORD PTR malloc_ptr[rip]
        movsx   rdi, edi
        add     DWORD PTR _ZL12malloc_count[rip], 1
        add     rax, 3
        and     rax, -4
        add     rdi, rax
        mov     QWORD PTR malloc_ptr[rip], rdi
        ret
.L3:
        xor     eax, eax
        ret
Добавлено через 18 секунд
Ну а теперь давайте про malloc. Раз уж дело пошло.

https://github.com/torvalds/li... s/mm.h#L34

Кликните здесь для просмотра всего текста
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
static void *malloc(int size)
{
    void *p;
 
    if (size < 0)
        return NULL;
    if (!malloc_ptr)
        malloc_ptr = free_mem_ptr;
 
    malloc_ptr = (malloc_ptr + 3) & ~3;     /* Align */
 
    p = (void *)malloc_ptr;
    malloc_ptr += size;
 
    if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
        return NULL;
 
    malloc_count++;
    return p;
}
 
static void free(void *where)
{
    malloc_count--;
    if (!malloc_count)
        malloc_ptr = free_mem_ptr;
}
https://github.com/torvalds/li... s/mm.h#L34


О многом не говорит. Но если мы взглянем на ассемблер данной функции, то тут всё очевидно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
malloc(int):
        test    edi, edi
        js      .L3
        mov     rax, QWORD PTR malloc_ptr[rip]
        movsx   rdi, edi
        add     DWORD PTR _ZL12malloc_count[rip], 1
        add     rax, 3
        and     rax, -4
        add     rdi, rax
        mov     QWORD PTR malloc_ptr[rip], rdi
        ret
.L3:
        xor     eax, eax
        ret
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 19:02
Цитата Сообщение от Ligren Посмотреть сообщение
Так как система закрытая у нас - Windows то мы на неё сразу забьём.
Какая у нас система не закрытая ? Ага! Linux вот вам ваша sbrk
Она в свою очередь использует Ассемблерные вставки
В MSVC++ для x64 и ассемблерных вставок нет. Или уже есть?
Но в Windows есть куча готовых функций для создания, удаления куч, и, кончено, выделения и освобождения участков памяти в этих кучах.
Но всё это - не часть стандарта С++.
0
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
03.10.2020, 19:05
Цитата Сообщение от politoto Посмотреть сообщение
Или уже есть?
Да вроде всегда была
https://docs.microsoft.com/ru-... ew=vs-2019

Добавлено через 1 минуту
Цитата Сообщение от Ligren Посмотреть сообщение
Да вроде всегда была
Хотя может и с VS15 появилась. Дока на __asm начинается с неё
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 19:19
Цитата Сообщение от microsoft
Inline assembly is not supported on the ARM and x64 processors.
https://docs.microsoft.com/en-... ew=vs-2019

Добавлено через 4 минуты
Цитата Сообщение от Ligren Посмотреть сообщение
может и с VS15 появилась
Был в 32-разрядном MSVC для x68 из Visual Studio 6. Скорее всего, и в 5-й был, но я точно не помню.
0
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
03.10.2020, 19:55
Цитата Сообщение от politoto Посмотреть сообщение
Inline assembly is not supported on the ARM and x64 processors.
Для меня x64 никакой пользы не даёт. Только замедляет работу кода. Обычно я использую SSE4.2+ и AVX-512 для сложно вычислительных моментов.

А если нужно много памяти, то легче сделать многопроцессорное приложение. 2 приложение по 4гб жрать могут, и работать могут распределяя потоки компьютера на ура. А если ещё и не 2 а 4 их. Прям сказка. Скорость может доходить на x2 выше по сравнению с 64x битным.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 22:13
64-разрядные системы стали основными для настольных машин.
Более просторное адресное пространство делает возможным другие стратегии управления.
Конечно, хорошо, что 32-разрядные и комбинированные процессы тоже могут работать в 64-разрядной системе.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
03.10.2020, 23:26  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Где читали, если не секрет?
Читал в интернете о том что это основные разделы Data...(полное название не помню) и BSS где ассемблер просит память. Потому что такого не может быть чтобы где попало оно запрашивало память. И мне не понятно что у вас сначала один пример потом другой пример потом третий. Должен быть какой-то общий принцип.

Добавлено через 4 минуты
Цитата Сообщение от Ligren Посмотреть сообщение
Всё есть, ты запросто можешь в c++ писать ассемблерными вставками.
Писать Ассемблерными вставками слишком накладно. Я думал можно обойтись языком высокого уровня чтобы реализовать прямой запрос памяти в разделе

Добавлено через 3 минуты
Цитата Сообщение от Ligren Посмотреть сообщение
Она в свою очередь использует Ассемблерные вставки
Так выглядит sbrk изнутри? А вы бы могли написать комментарии что происходит в вашем примере и для чего тут используются команды register?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.10.2020, 23:57
Это не c++, и даже не Си, а gcc.
Используется множество нестандартных и несовместимых с языком расширений.

В С++ ключевое слово register устарело
https://en.cppreference.com/w/... e_duration
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
04.10.2020, 00:03  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
В С++ ключевое слово register устарело
У меня 98ой стандарт походу должен его поддерживать. Данный спецификатор имеет очень узкое назначение. Компилятор иногда может его игнорировать.
что происходит в этом блоке?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#if defined(__x86_64__)
#define my_syscall1(num, arg1)                                                \
({                                                                            \
    long _ret;                                                            \
    register long _num  asm("rax") = (num);                               \
    register long _arg1 asm("rdi") = (long)(arg1);                        \
                                          \
    asm volatile (                                                        \
        "syscall\n"                                                   \
        : "=a" (_ret)                                                 \
        : "r"(_arg1),                                                 \
          "0"(_num)                                                   \
        : "rcx", "r8", "r9", "r10", "r11", "memory", "cc"             \
    );                                                                    \
    _ret;                                                                 \
})
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
04.10.2020, 06:03
Выполняется системный вызов с одним параметром ( вызов одной из функций супервизора ( "ядра" ) linux ) в соответствии с принятым в linux для x86_64 ABI
https://www.cyberforum.ru/c-linux/

Добавлено через 16 минут
Цитата Сообщение от Nexi99 Посмотреть сообщение
У меня 98ой стандарт походу должен его поддерживать. Данный спецификатор имеет очень узкое назначение. Компилятор иногда может его игнорировать.
Компиляторы c++ поддерживали register как синоним auto до с++11 :

C++
1
2
3
4
5
6
7
8
int 
main( 
auto int count,
auto char* agruments[] )
{
    register int a = count + 1;
    return 0 == &a; 
}
Bash
1
g++ -c auto.c++  -std=c++98
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
04.10.2020, 06:18  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Компиляторы c++ поддерживали register как синоним auto до с++11
ну там да можно используя команду mov ложить в регистр значение любого типа, что есть и плюс и минус, типизация помогает проверять ошибки а безтипизация позволяет лучше управлять данными. Но опять же меня интересует конкретно в каких разделах просится память и каким можно получить доступ из с++ на 98ом стандарте?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
04.10.2020, 07:27
Разделов нет ни в 98-м стандарте , ни в 20-м
В с++ есть storage class, const/volatile, типы данных с выравниванием и прочими атрибутами
https://en.cppreference.com/w/... e_duration
https://en.cppreference.com/w/cpp/language/scope
В зависимости от того, где определён объект, как он иницализирован ( или не инициализирован ), от его storage class etc., принятых в системе соглашений, настроек системы программирования на с++, компилятор может разместить в объектном файле указания для компоновщиков и загрузчиков, какие программные секции, сегменты, разделы создать, какого размера, с какими атрибутами и чем их заполнить до начала выполнения программы.
Если, конечно, разделы (секции, сегменты etc.) предусмотрены в конкретной системе, на которой должна выполняться программа.

О конкретных системах лучше задавать вопросы в конкретных разделах: https://www.cyberforum.ru/c-linux/
https://www.cyberforum.ru/win-api/ https://www.cyberforum.ru/cpp-builder/ и т.д.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
04.10.2020, 20:45  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
компилятор может разместить в объектном файле указания для компоновщиков и загрузчиков, какие программные секции, сегменты, разделы создать, какого размера, с какими атрибутами и чем их заполнить до начала выполнения программы.
Если, конечно, разделы (секции, сегменты etc.) предусмотрены в конкретной системе, на которой должна выполняться программа.
Размещение таких объектов для меня имеет второстепенное значение. Меня интересует вопрос где можно самому запросить память (имеется в виду запрос динамической памяти) у системы в каких разделах, и в частности к каким разделам можно получить доступ из языка высокого уровня? Дело в том что мне не нравятся существующие функции выделения памяти new и другие и я хочу построить свою функцию которая будет обращаться в такие разделы и просить память у меня будет свой описатель и свои правила. И ребята по возможности не вылаживайте ассемблерные коды, если вылаживаете то комментируйте потому что на Ассемблере я не пишу физически не могу с ним работать.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.10.2020, 11:01
В любом случае память, одновременно доступная программе ограничена имеющимся адресным пространством ( 16-разрядным, 32-разрядным, 48-разрядным и т.д.).
Можно для временного или постоянного хранения страниц памяти использовать файлы, или, как Ligren, создавать дочерние процессы, выделять память в их адресном пространстве, и, если возникнет такая необходимость, системозависимыми функциями для взаимодействия процессов получать доступ к некоторым областям этой памяти.
Но и в этом случае действуют те же ограничения. 6-гигабайтный массив данных целиком в 32-разрядное адресное не поместится. Часть массива всегда будет "невидимой" для выполняющего программу процессора.
Если не важно размещение объектов, то и в разделах их размещать необязательно ?
Размеры разделов и их расположение в адресном пространстве определяются при компоновке и загрузке исполняемого (загрузочного) модуля.
Если нужно хранить что-то в разделе для неинициализированных объектов,
можно зарезервировать область большого размера, определив какой-нибудь массив
и хранить там, например координаты четырёхмерных объектов, при этом своими средствами следить за занятым и своободным пространством в этом массиве.
C++
1
double heap[4 * 10000000]; // достаточно для хранения координат 10 000 000 вершин
Это универсальный платформонезависимый (за исключением доступного объема) способ, подходящий практически для любых языков высокого уровня.

В C++ у нас есть два стандартных варианта оператора new.
В одном адрес нового объекта задаёт программа, в другом (основном) - адрес размещения новому объекту назначает стандартная библиотека.
Программа на С++ может определять свои операторы new с другими параметрами,
переопределять глобальный оператор new.
Свой оператор new можно определить для отдельных структур и классов.
По наследству от стандартной библитеки Си досталась std::malloc().

В "старых" (но не самых древних) стандартах есть std::allocator
https://en.cppreference.com/w/cpp/memory/allocator
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.10.2020, 16:36
Цитата Сообщение от Nexi99 Посмотреть сообщение
Дело в том что мне не нравятся существующие функции выделения памяти new и другие и я хочу построить свою функцию которая будет обращаться в такие разделы и просить память у меня будет свой описатель и свои правила.
Не в ту сторону копаете. Самописные new/delete берут большой кусок памяти и потом пилят его на кусочки поменьше. Ключевым моментом здесь является как пилить, а не где этот самый кусок взять. Да хоть malloc(100500) вызывайте.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2020, 16:36

Написать функцию выделения первого слова из строки
Написать эту функцию - это ещё пол беды. Ещё необходимо ИСПОЛЬЗУЯ именно эту функцию найти в строке первое слово (не число) максимальной...

Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
Дан класс и указатель: class X{ int a; public: X(int _a) {a = _a;} }; X *p; Напишите инструкцию выделения памяти для...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Написать код для динамического выделения памяти под массив из 10000 целых чисел
Прошу помочь с решением ! Написать код для динамического выделения памяти под массив из 10000 целых чисел. Продемонстрировать заполнение...

Написать функцию выделения произвольной строки двумерного массива в одномерный
Написать функцию выделения произвольной строки двумерного массива в одномерный. Выделить две произвольные строки.


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru