![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Вопрос:
Будет ли корректно скопирован массив а в массив b, и не возникнет ли ситуация, что по выходу из Foo в массиве b окажутся левые данные, т.к. массив a локальная переменная, а b всего лишь указатель на нее?
Это сообщение отредактировал(а) Delphist - 9.1.2011, 13:34 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
При присваивании
счетчик ссылок на массив a будет увеличен на 1. Легко проверить:
При выходе из процедуры счетчик ссылок уменьшится на 1, но не будет равен 0, поскольку внешняя b ссылается на него, поэтому массив не будет освобожден, и данные будут корректны. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Т.е. массив а выделяется не в памяти локального стека Foo? Добавлено через 4 минуты и 59 секунд а счетчик ссылок судя из кода храниться по адресу где был выделен массив со смещением на 8 байт? -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Вот так правильно:
Это сообщение отредактировал(а) lukas - 9.1.2011, 14:51 -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
А интерфейсы в delphi по этому же принципу работают, в смысле тоже счетчик создается?
Я так понимаю это что-то из серии garbage collection Добавлено @ 14:51 не совсем, твой способ медленнее Это сообщение отредактировал(а) Delphist - 9.1.2011, 14:54 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Ну, если не ошибаюсь, память под динамические массивы выделяется из «кучи», так что существование динамического массива за пределами локальной области видимости процедуры нормально.
Угу. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
А как считаешь какой способ копирования лучше, то что я написал или же что lukas, -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Delphist
Copy функция работает с массивами, она довольно быстрая, а то что ты привел, это не копирование, так вообще вроде не делают. Ты правильно используешь ссылку на массив, создав тип PDynArrOfInt, вот и его везде и используй, а T* не используй вообще (если не хочешь копирования). -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Забудьте о типе "указатель на динамический массив". Переменная типа "динамический массив" - это уже указатель. Переменная - локальная, но ссылается на данные в куче.
Да. Подробнее смотрите моё сообщение по ссылке: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=62357 Если написать a := b; то a и b будут ссылаться на одни и те-же данные в куче. Принципальная разница между строками и динамическими массивами состоит в следующем: Для строк при изменении данных через одну из переменных, захватывается новая память и модифицируется копия, после чего указатели будут ссылаться уже на разные данные. Для динамических массивов такого перезахвата не производится, и при изменении данных через одну переменную, изменяться будут и данные, читаемые через другую, т.к. эти переменные будут продолжать ссылаться на одни и те-же данные. Если интересно про строки, можете посмотреть мой пример здесь: http://www.delphikingdom.com/asp/articles_...?ArticleID=1206 |
|||
|
||||
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Я объясню зачем такое нужно, например, мы передаем такую структуру:
Добавлено @ 16:34 Не правда, если сделать так:
И вот для таких то случаев, в локальные процедуры массив лучше передавать через указатель Это сообщение отредактировал(а) Delphist - 9.1.2011, 16:38 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| БелАмор |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Я допустил неточность. Я имел в виду изменение отдельных элементов массива без изменения длины самого массива. В случае вызова SetLength, естественно, происходит перезахват памяти и переменные уже будут ссылаться на разные данные.
Для таких случаев массив в процедуру следует передавать как var-параметр. А внутри процедуры можно либо работать напрямую с оригинальным массивом, либо завести локальный, работать с ним, а потом присвоить переданной перменной. Кстати, обратите внимание на модуль Types Там, в частности, уже объявлен тип: TIntegerDynArray = array of Integer; Соответственно, оптимальным, в зависимости от конкретных требований, на мой взгляд, будет один из вариантов:
|
||||||
|
|||||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
var для динам. массивов в параметрах функции вообще нет смысла использовать!
Это сообщение отредактировал(а) Delphist - 9.1.2011, 17:47 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Если там будет const или без (не помню), будет происходить постоянное копирование массива перед вызовом, я проверял. -------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| БелАмор |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Хм... Почему? Хотя бы минимальное обоснование... Вы точно не путаете с классовыми переменными?
Передача параметров без спецификатора, с const, и с var - это три большие разницы... При const, и var не копируется вообще ничего, именно поэтому, в частности, с этими спецификаторами рекомендуют передавать, например, записи... |
||||
|
|||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Да очень просто - смысл использования var. var для массива зачем? чтобы изменить адрес массива - но это если и нужно то очень редко -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |