Перейти к содержанию
    

Выделение памяти в языках высокого уровня.

Интересует реализицая в C#, Qt и им подобным.

Скажем лист

List<MyObject> objects;

Он как реализован? Как связанный список? А если я добавил объект в список, потом другой процесс выделил память, потом добавил ещё объект, что получиться?

 

objects

1-й объект

Кусок памяти другого процесса.

objects

2-й объект

 

 

Теперь стринг

string str;

//тут он вернул «ааааа»
str = GetString();
//тут он вернул «бб»
str = GetString();

str вряд ли указатель в данном случае. Динамическое выделение? А во втором случае – переопределение?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я погуглил про c#

https://habr.com/ru/company/pvs-studio/blog/691476/

Под капотом List<T> построен с использованием массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 9:14 AM, Lmx2315 said:

я погуглил про c#

https://habr.com/ru/company/pvs-studio/blog/691476/

Под капотом List<T> построен с использованием массива.

мне эти 

AddWithResize(item);

Grow(size + 1);

непонятны. где место Зин? смежный кусок памяти уже занят, кто то его занял.

On 11/14/2022 at 9:19 AM, Forger said:

Да

во втором случае "бб" переопределение? а если в третьем случае вернули длинную строку а места нет?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, jenya7 сказал:

мне эти 

AddWithResize(item);

Grow(size + 1);

непонятны. где место Зин? смежный кусок памяти уже занят, кто то его занял.

Какой смежный? CLR увеличивает размер массива в том куске памяти где есть требуемый объём и всё туда заново копирует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 9:47 AM, Lmx2315 said:

Какой смежный? CLR увеличивает размер массива в том куске памяти где есть требуемый объём и всё туда заново копирует.

а то место откуда копирует - там дырка остаётся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jenya7 сказал:

а то место откуда копирует - там дырка остаётся?

Дырка, пока сборщик мусора её не приберёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 9:53 AM, Lmx2315 said:

Дырка, пока сборщик мусора её не приберёт.

а что сборщик мусора может сделать? перераспределит память более оптимально? а если где то инициализирован указатель на данный адрес памяти, он и указатель поменяет на новый адрес?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, jenya7 сказал:

а что сборщик мусора может сделать? перераспределит память более оптимально? а если где то инициализирован указатель на данный адрес памяти, он и указатель поменяет на новый адрес?

Что он делает с памятью насчёт оптимальности я не знаю, а вот ссылки поправит, указатели там только в "небезопасном режиме" и они конечно испортятся. Хотя мы уходим туда где я всё менее компетентен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 10:00 AM, Lmx2315 said:

Что он делает с памятью насчёт оптимальности я не знаю, а вот ссылки поправит, указатели там только в "небезопасном режиме" и они конечно испортятся. Хотя мы уходим туда где я всё менее компетентен.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, jenya7 сказал:

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

Я думаю что чудес не бывает, надо выделять память, возвращать обратно, следить за состоянием и дефрагментировать время от времени. А вообще - тот кто хочет надёжности выделяет память статически.

Кстати, про c# он когда ему надо выделить новую память под list, он новую память выделяет вдове больше чем была, даже если надо увеличить на +1, это как стратегия минимизации издержек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 10:09 AM, Lmx2315 said:

Я думаю что чудес не бывает, надо выделять память, возвращать обратно, следить за состоянием и дефрагментировать время от времени. А вообще - тот кто хочет надёжности выделяет память статически.

Кстати, про c# он когда ему надо выделить новую память под list, он новую память выделяет вдове больше чем была, даже если надо увеличить на +1, это как стратегия минимизации издержек.

да уж, выделять статически. я сейчас упёрся в проблемку, есть парсер пользовательского скрипта, который "компилируется" в массив выражений. массив статический но я не знаю какой скрипт напишет пользователь и сколько памяти выделить статически. завтра у пользователя разыграется фантазия и он переполнит мой статический массив.

 

я перешёл на одноплатник, там конечно полёт души. но другая проблема - у одноплатника нету всей микроконтроллерной периферии, коротка кольчужка.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, jenya7 said:

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

STL в мк с ее активным использованием кучи вряд ли будет уместно. Да и сборщика мусора тут никакого нет.

Альтернативные реализации кучи возможны, но это только для спецов, кто знает что делает.

9 minutes ago, jenya7 said:

завтра у пользователя разыграется фантазия и он переполнит мой статический массив.

Если массив создается на этапе запуска МК и под него выделяется память один раз, то ничего страшного в динамическом создании массива нет. Но нужно мониторить все нештатные ситуации с дин памятью, т.е. опять-таки требуется некоторый опыт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/14/2022 at 10:37 AM, Forger said:

STL в мк с ее активным использованием кучи вряд ли будет уместно. Да и сборщика мусора тут никакого нет.

Альтернативные реализации кучи возможны, но это только для спецов, кто знает что делает.

Если массив создается на этапе запуска МК и под него выделяется память один раз, то ничего страшного в динамическом создании массива нет. Но нужно мониторить все нештатные ситуации с дин памятью, т.е. опять-таки требуется некоторый опыт.

не так завтра пользователь напишет другой скрипт. скрипт то не статический. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 minutes ago, jenya7 said:

не так завтра пользователь напишет другой скрипт. скрипт то не статический.

Читайте внимательнее:

36 minutes ago, Forger said:

Если массив создается на этапе запуска МК и под него выделяется память один раз, то ничего страшного в динамическом создании массива нет.

Вот например в одном из своих проектов загружаю json файл с настройками, выделяя под него память динамически, по размеру файла. После рестарта МК все по новой.

Но выделение таких больших кусков использую однократно при старте. 

Но и у куча у меня другая, нештатная, на базе TLSF

Разумеется, есть контроль за размерами и пр. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...