|
|
|
Статический массив неизвестной длины
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39918461&tid=2038640]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 475ms |

| 0 / 0 |
