|
|
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Вот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер. К как при этом изменять его размер без реаллока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:43:08 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey_Vasilisk_но что из этого получится - сам знаешь Ничего страшного.Out of memory отгребешь. Ну сравните уже код Код: pascal 1. 2. 3. Код: pascal 1. Код: pascal 1. 2. 3. 4. 5. 6. 7. на быстродействие и потребляемую память Kazantsev AlexeyА если мне не нужен интерфейс стрима, зачем огород-то городить?Чтобы не писать собственный Grow-костыль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:45:08 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_schiTBytes. Удобно, знаете ли.На любителя. Нет, конечно, если Вас не смущает постоянные реаллоки + бешеное фрагментирование памяти, то используйте, на здоровье. Меня не смущает. Мне кажется, что постоянность реаллоков и бешенство фрагментирования памяти несколько преувеличены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:46:48 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
rgreatВот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер. К как при этом изменять его размер без реаллока?Можно. Если хранить отдельно выделенный и реальный размер. Что и делает TBytesStream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:47:00 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
rgreatВот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер. К как при этом изменять его размер без реаллока? Точно так же, через SetLength() и хранить размер используемой памяти отдельно. Но фишка в том, что SetLength() использует тот же ReallocMem что и TMemoryStream и при небольших изменениях длины массива обычно не происходит копирования данных. А TStream для каждого буфера использовать довольно накладно в плане оверхеда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:47:06 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Чтобы не писать собственный Grow-костыль Обычно сценарий при использовании TBytes выглядит так: 1. Получить размер данных 2. Выделить память 3. Получить данные или так: 1. Выделить максимально возможный размер для данных 2. Получить данные 3. Уменьшить размер по факту. В таких случаях TMemoryStream - излишен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:50:09 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
alekcvpОбычно сценарий при использовании TBytes выглядит так: 1. Получить размер данных 20728743 _Vasilisk_Если размер известен заранее, то массив, если нет - TList ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:56:31 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_alekcvpОбычно сценарий при использовании TBytes выглядит так: 1. Получить размер данных 20728743 _Vasilisk_Если размер известен заранее, то массив, если нет - TList Читается как "если размер известен на этапе компиляции". Ну и второй сценарий не попадает в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:58:26 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Нет, конечно, если Вас не смущает постоянные реаллоки + бешеное фрагментирование памяти, то используйте, на здоровье. Ты сам-то проверял, прежде чем писать это? _Vasilisk_Чтобы не писать собственный Grow-костыль Поиграем в реаллокации Код: 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. 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. Итого, на 1048576 операций изменения размера, реальных реаллокацуий: на FastMM - 17, на голом позиксе 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:01:19 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
alekcvpТочно так же, через SetLength() и хранить размер используемой памяти отдельно. Не, интересно именно захакать сам Array, дабы менять его длинну не вызывая Realloc-ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:02:54 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Где посмотреть его структуру в памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:05:34 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
rgreatГде посмотреть его структуру в памяти? Поставь дебаг на SetLength() и пошагово посмотри, там найдёшь. Примерно такая же как у старых string: -4 байта длина, потом данные. RefCount не помню есть или нет. Если хочешь хакнуть, то скорее всего получишь свой TMemoryStream, т.к. придётся писать и свою SetLength() для своего массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:09:13 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Нашел вот: Код: pascal 1. 2. 3. А что там для x64? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:14:11 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
В TMemoryStream есть protected свойство Capacity. Однажды было проще использовать, чем Size со всеми "запоминаниями". (Было что-то типа Capacity := Trunc(примерный_размер_данных * 1.5)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:17:39 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyТы сам-то проверял, прежде чем писать это?Проверял. D2006 или D7, уже не помню, поднимала Out of memory ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:41:55 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Проверял. D2006 или D7, уже не помню Дельфя начиная с D2006 идёт с FasMM по дефолту. p.s. Сперва топит за TList<>, а потом вспомнил о D7. Смешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:47:39 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Я на 2006 написал свой TList, который на Add делал GetMem, а на Delete - Finalize + FreeMem. Любые манипуляции с динамическим массивом в результате заканчиваются "своим собственным TList/TObjectList". Этот "TMySuperList" делает всё тоже самое что и обычный TList, только 1. Реализованы такими алгоритмами, которые были актуальны для точки зрения автора на тот конкретный момент его жизни. Чаще всего - с ошибками. 2. Никаких явный преимуществ данный новый класс не даёт. 3. Что бы работать с таким классом, надо будет "понять" и разобраться в гениальных идеях автора, т.е. мыслить как он n-лет назад, и переделать на стандартный TList. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 09:40:20 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
rgreatГде посмотреть его структуру в памяти? в самом неожиданном и непредсказуемом месте Delphi -> Documentation -> Data Types -> Internal Data Formats http://docwiki.embarcadero.com/RADStudio/Tokyo/en/About_Data_Types_(Delphi) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 18:32:55 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
AriochDelphi -> Documentation -> Data Types -> Internal Data Formats А ссылку кривую дал :) http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Internal_Data_Formats_(Delphi) Только там про дин. массивы чушь написана. Реальное положение дел описано в System.pas - TDynArrayRec; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 19:11:40 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вышло более чем вдвое быстрей чем обычный циклический SetLength+1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 19:14:34 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyТолько там про дин. массивы чушь написана. Посыпаю голову пеплом. Всё нормально там написано :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 19:49:03 |
|
||
|
Динамические массивы в Delphi XE7 - XE10
|
|||
|---|---|---|---|
|
#18+
rgreatВышло более чем вдвое быстрей чем обычный циклический SetLength+1.А почему не в (64-1) раза быстрей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2017, 23:12:10 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39506504&tid=2041929]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
194ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 475ms |

| 0 / 0 |
