|
|
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Задача: нужен класс контейнер, который будет хранить до 5-6 элементов. Количество элементов известно на этапе компиляции. Писать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. не могу из-за жесткого ограничения по памяти (оверхед при выделении памяти для динамического массива, а контейнеров создается очень много). По этой же причине не нравится Код: pascal 1. Сейчас делаю так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. оверхеда нет вообще, но много кода. Можно как-то подсократить? Пытался так Код: pascal 1. 2. 3. но компилятор не считает SizeOf(T) константой. С уважением, Vasilisk ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 13:49 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Сколько контейнеров и сколько элементов в одном контейнере Вы максимально хотите создать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:13 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Задача: нужен класс контейнер, который будет хранить до 5-6 элементов. Количество элементов известно на этапе компиляции. Писать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. не могу из-за жесткого ограничения по памяти (оверхед при выделении памяти для динамического массива, а контейнеров создается очень много). По этой же причине не нравится Код: pascal 1. О каком оверхеде идет речь? Код: pascal 1. выделит ~4 Кб памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:46 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Перекрыть NewInstance не рассматривали? Можно выделить чуть больше памяти и хранить там массив, оверхеда быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:50 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
x1ca4064 Перекрыть NewInstance не рассматривали? Можно выделить чуть больше памяти и хранить там массив, оверхеда быть не должно. А потом, кто-нибудь станет использовать для объекта синхронизацию монитором... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:01 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Кмк, говорить об оверхеде и при этом применять классы-контейнеры, содержащие классы же - это странно. Но окей, допустим. В таком случае можно, например, использовать нечто вроде: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. UPD А еще (для любителей проктостоматологии) размер объекта у класса вычисляется как Код: pascal 1. 2. 3. 4. соответственно известно что делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 16:45 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Перейдете с классов на пакед рекорды - сэкономите память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 16:49 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Вообще, если говорить о затратах памяти, любой объект изначально уже тратит больше 100 байт только на х32 (vmtCreateObject - vmtSelfPtr). Это еще не считая оверхеда менеджера памяти и своих виртуальных методов и не говоря про х64. Короче, классы - это не вариант, если нужно экономить память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 16:59 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Василий 2 Вообще, если говорить о затратах памяти, любой объект изначально уже тратит больше 100 байт только на х32 Да ты гонишь. Объект минимум - 4 байта - ссылка на VMT класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:10 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Объект минимум - 4 байта Сам себя поправлю, таки 8 байт. В размер включается ссылка на монитор. Соответственно, ничего страшного не случится даже если 22066064 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:23 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Sinemurius Сколько контейнеров Sinemurius и сколько элементов в одном контейнере Вы максимально хотите создать ? Квейд О каком оверхеде идет речь? Код: pascal 1. выделит ~4 Кб памяти Код: pascal 1. выделит 8 байт на сам массив + 8 байт на это Код: pascal 1. 2. 3. 4. 5. 6. 7. итого оверхед 50% x1ca4064 Перекрыть NewInstance не рассматривали? Kazantsev Alexey А потом, кто-нибудь станет использовать для объекта синхронизацию монитором... Василий 2 В таком случае можно, например, использовать нечто вроде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:39 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
x1ca4064 Перекрыть NewInstance не рассматривали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:40 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ И в чем противопоказания? Да уже ни в чём. InstanceSize возвращает размер с учётом ссылки на монитор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:52 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Много. Несколько сотен. Может тысяча Эм... Это из-за 4-8 KB такая заморока??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 17:53 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Эм... Это из-за 4-8 KB такая заморока??? Создается тысячи мелких объектов (InstanceSize < 100 байт) и у системы отжирается 100 мегабайт. Создание этих объектов для 10 владельцев и OutOfMemory. Сейчас после базового рефракторинга удалось сократить базовое выделение до 20 мегабайт. Где-то FastMM чудит и забирает у системы память сильно про запас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 18:14 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Где-то FastMM чудит и забирает у системы память сильно про запас Посмотри демку Usage Tracker. Она даёт полную картину выделения памяти, размеры блоков, степень оверхеда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 18:32 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Василий 2 Вообще, если говорить о затратах памяти, любой объект изначально уже тратит больше 100 байт только на х32 (vmtCreateObject - vmtSelfPtr). Это еще не считая оверхеда менеджера памяти и своих виртуальных методов и не говоря про х64. Короче, классы - это не вариант, если нужно экономить память проверил. Что TObject.Create, что New(pInteger) занимают 16 байт (даже в x64). Видимо, для TObject там только указатель на VMT и резервный указатель на Monitor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 18:43 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Вот Usage Tracker. Можно посмотреть какие реальные размеры блоков использует менеджер. Например, при выделении 13 байт реально выделяется 20 из пула размером 29488. P.S. Данные для XE2, на более поздних они могут отличаться. P.P.S. Проверил в 10.3 - размеры те же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 18:59 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 19:16 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Посмотри демку Usage Tracker. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 19:54 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Где ее брать? Стандартная демка дельфийская. Правда с какой-то версии её перестали поставлять, но в XE2 она точно есть. Может есть в их репе с демками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 20:14 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Нашёл . XE6 последняя, где эта демка была. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 20:23 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ x1ca4064 Перекрыть NewInstance не рассматривали? Я бы делал через Код: sql 1. соответственно для разных TContainer1..5 возвращал кол-во элементов массива, хотя можно и через какой-нибудь threadvar, но это как-то не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 00:08 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Что мешает сделать статический массив максимального требуемого размера и использовать только нужную его часть? Накладные расходы - пара лишних байт, тут уж точно никакого перерасхода памяти не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 00:16 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
alekcvp, Зашибись, типа собственный менеджер памяти давай напишем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 00:58 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
ёёёёё alekcvp, Зашибись, типа собственный менеджер памяти давай напишем. Ну если у него действительно стопиццоттыщ массивчиков по 5-6 элементов, то динамические массивы реально дают большие накладные расходы: сначала минимальный размер блока в менеджере памяти, потом заголовок блока в менеджере памяти (размер хз), потом префикс динамического массива (8 байт вроде), т.е. ради 20-24 байт данных сверху может набежать ещё дохрена (+ выравнивание). А в моём варианте - нужна только одна переменная, размером в байт, содержащая используемый размер массива. И статические массивы никаких накладных расходов не несут. Можно вообще изобрести заново shortstring: двумерный статический массив, в каждой строке которого 0й элемент - размер данных в этой строке :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 01:11 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
ёёёёё Зашибись, типа собственный менеджер памяти давай напишем. Мысль, на самом деле, здравая. У ТС в контейнере максимум 6 элементов. Даже если храниться будет только 1, то оверхед составит всего 20/40 байт. Таких контейнеров у него около тысячи, итого максимальный оверхед 20/40 KB. Какая-то непонятная попытка экономить на спичках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 01:13 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Мысль, на самом деле, здравая. У ТС в контейнере максимум Темнит ТС что-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 01:24 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
ёёёёё Темнит ТС что-то. Не поленился написать тест. Код: pascal 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. Создание 1000 контейнеров с 1-5 детьми каждый "сжирает" менее 100 кб памяти. В общем доблестный инспектор Лестрейд уверенно пошел по ложному следу. Откуда у него там десятки мегабайт - тайна скрытая мраком. Либо у него все жрет TMyObject либо утечки где-то еще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2020, 02:30 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Да ты гонишь. Объект минимум - 4 байта - ссылка на VMT класса. Блин, точно. Ориентировался на код типа PInteger(PByte(Self) + vmtInstanceSize)^, но упустил из виду, что это метод класса, то есть Self там это TObject. _Vasilisk_ Вы исходный вопрос читали? Именно от этого варианта и хочется уйти Во-первых, это совсем не тот вариант, что в исходном вопросе, а во-вторых, какое изложение (кривое) - такой и ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2020, 10:27 |
|
||
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#18+
DmSer Василий 2 Вообще, если говорить о затратах памяти, любой объект изначально уже тратит больше 100 байт только на х32 (vmtCreateObject - vmtSelfPtr). Это еще не считая оверхеда менеджера памяти и своих виртуальных методов и не говоря про х64. Короче, классы - это не вариант, если нужно экономить память проверил. Что TObject.Create, что New(pInteger) занимают 16 байт (даже в x64). Видимо, для TObject там только указатель на VMT и резервный указатель на Monitor. У каждого блока оказывается есть ещё заголовок размером NativeUInt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2020, 15:00 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038640]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
7ms |
get forum data: |
5ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 449ms |

| 0 / 0 |
