Записи в Delphi

Я все еще думаю, что предел не ограничен на визуальной части. Несомненно, мониторы и разрешения являются достаточно большими для показа еще большего количества символов в одной строке в наше время, но она увеличивает удобочитаемость?

, Если предел действительно осуществляется, это - также серьезное основание заново продумать код и не для помещения всего в одну строку. Это - то же с добавлением отступа - если Вам нужно ко многому, выравнивается, Ваш код должен заново продуматься.

14
задан Kromster says support Monica 5 March 2014 в 20:22
поделиться

5 ответов

Для 1 и 2: записи являются типами значений, а классы - ссылочными типами. Они выделяются в стеке или непосредственно в пространстве памяти любой более крупной переменной, которая их содержит, а не с помощью указателя, и автоматически очищаются компилятором, когда они выходят за пределы области видимости.

Что касается вашего третьего вопроса, TList внутренне объявляет массив TMyRecord для хранения. Все записи в нем будут очищены при уничтожении списка. Если вы хотите удалить конкретный файл, используйте метод Delete для удаления по индексу или метод Remove для поиска и удаления. Но имейте в виду, что, поскольку это тип значения, все, что вы делаете, будет копировать запись, а не копировать ссылки на нее.

10
ответ дан 1 December 2019 в 06:39
поделиться

Есть еще несколько различий между классом и записью. Классы могут использовать полиморфизм и предоставлять интерфейсы. Записи не могут реализовывать деструкторы (хотя, начиная с Delphi 2006, они теперь могут реализовывать конструкторы и методы).

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

3
ответ дан 1 December 2019 в 06:39
поделиться

Одно из основных преимуществ записей - это наличие большого «массива записей». Это создается в памяти путем выделения пространства для всех записей в одном непрерывном пространстве ОЗУ, что происходит очень быстро. Если бы вместо этого вы использовали «массив TClass», каждый объект в массиве должен был бы быть выделен сам по себе, что происходит медленно.

Было проделано много работы по повышению скорости выделения памяти, чтобы улучшить скорость строк и объектов, но она никогда не будет такой же быстрой, как замена 100 000 выделений памяти на 1 выделение памяти.

Однако, если вы используете массив записей, не копируйте запись в локальных переменных. Это может легко убить выигрыш в скорости.

9
ответ дан 1 December 2019 в 06:39
поделиться

Между записями и классами есть много различий; и нет «Указателя для записи» <> «Класс». У каждого есть свои плюсы и минусы; одна из важных вещей в разработке программного обеспечения - это понимать их, чтобы вам было легче выбрать наиболее подходящий для данной ситуации.

  1. Этот вопрос основан на ложной предпосылке. Записи не похожи на классы точно так же, как целые числа не похожи на двойные.
    • Экземпляры классов всегда должны создаваться динамически, тогда как это возможность, но не требование для записей.
    • Экземпляры классов (которые мы называем объектами) всегда передаются по ссылке, что означает, что несколько разделов кода будут совместно использовать и действовать в том же экземпляре. Это важно помнить, потому что вы можете непреднамеренно изменить объект в качестве побочного эффекта; хотя, если это сделано намеренно, это мощная функция. С другой стороны, записи передаются по значению; вам нужно явно указать, передаете ли вы их по ссылке.
    • Классы не «копируются так же легко, как записи». Когда я говорю «копировать», я имею в виду отдельный экземпляр, дублирующий источник. (Это должно быть очевидно в свете приведенного выше комментария значения / ссылки.)
    • Записи, как правило, очень хорошо работают с типизированными файлами (потому что они ' его так легко скопировать).
    • Записи могут перекрывать поля с другими полями (case x of / union)
    • Это были комментарии по определенным ситуационным преимуществам записей; наоборот, существуют ситуативные преимущества для классов, которые я не буду вдаваться в подробности.
  2. Возможно, самый простой способ понять это - проявить немного педантизма. Поясним; память на самом деле не выделяется «при объявлении», она выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее окончания. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  3. Опять же, есть плюсы и минусы ...
  4. Записи могут перекрывать поля с другими полями (случай x of / union)
  5. Это были комментарии по определенным ситуационным преимуществам записей; наоборот, существуют ситуативные преимущества для классов, которые я не буду вдаваться в подробности.
  6. Возможно, самый простой способ понять это - проявить немного педантизма. Поясним; память на самом деле не выделяется «при объявлении», она выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее окончания. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  7. Опять же, есть плюсы и минусы ...
  8. Записи могут перекрывать поля с другими полями (случай x of / union)
  9. Это были комментарии по определенным ситуационным преимуществам записей; и наоборот, существуют ситуативные преимущества для классов, которые я не буду вдаваться в подробности.
  10. Возможно, самый простой способ понять это - проявить немного педантизма. Поясним; память на самом деле не выделяется «при объявлении», она выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее завершения. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  11. Опять же, есть плюсы и минусы ... есть также ситуативные преимущества для классов, которые я не буду вдаваться в подробности.
  12. Возможно, самый простой способ понять это - проявить немного педантизма. Поясним; память на самом деле не выделяется «при объявлении», она выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее завершения. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  13. Опять же, есть плюсы и минусы ... есть также ситуативные преимущества для классов, которые я не буду вдаваться в подробности.
  14. Возможно, самый простой способ понять это - проявить немного педантизма. Поясним; память на самом деле не выделяется «при объявлении», она выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее окончания. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  15. Опять же, есть плюсы и минусы ... s выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее окончания. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  16. Опять же, есть плюсы и минусы ... s выделяется, когда переменная находится в области видимости, и освобождается, когда она выходит за пределы области видимости. Таким образом, для локальной переменной она выделяется непосредственно перед началом процедуры и освобождается сразу после ее окончания. Для поля класса он выделяется при создании объекта и освобождается при его уничтожении.
  17. Опять же, есть плюсы и минусы ...
    • Это может быть медленнее и требовать больше памяти для копирования целых записей (как и в случае с универсальными шаблонами), чем для простого копирования ссылок.
    • Передача записей по ссылке (с использованием указателей) - мощный метод, с помощью которого вы можете легко получить что-то еще изменить вашу копию записи. Без этого вам пришлось бы передавать свою запись по значению (т.е. копировать ее), получать в результате измененную запись, снова копировать ее в свои собственные структуры.
  18. Являются ли указатели на записи классами? Нет, совсем нет. Всего два отличия:
    • Классы поддерживают полиморфное наследование.
    • Классы могут реализовывать интерфейсы.
19
ответ дан 1 December 2019 в 06:39
поделиться

1) Чтобы учесть наследование и полиморфизм, классы имеют некоторые накладные расходы. Записи не допускают их, и в некоторых ситуациях может быть несколько быстрее и проще в использовании. В отличие от классов, которые всегда выделяются в куче и управляются с помощью ссылок, записи также можно размещать в стеке, обращаться к ним напрямую и присваивать друг другу без необходимости вызова метода «Назначить». Также записи полезны для доступа к блокам памяти с заданной структурой, потому что их структура памяти точно такая, как вы ее определяете. Компоновка памяти экземпляра класса контролируется компилятором и содержит дополнительные данные для работы объектов (например, указатель на таблицу виртуальных методов).

2) Если вы не распределяете записи динамически, используя New () или GetMem (), записи Память управляется компилятором как порядковые числа, числа с плавающей запятой или статические массивы: память глобальных переменных выделяется при запуске и освобождается, когда программа завершается, а локальные переменные выделяются в стеке при входе в функцию / процедуру / метод и освобождаются при выходе. Выделение / высвобождение памяти в стеке происходит быстрее, потому что не требуется вызовов диспетчера памяти, просто очень мало инструкций ассемблера для изменения регистров стека. Если записи являются полями класса, они выделяются при создании класса и освобождаются, когда класс освобождается.

3) Одно из преимуществ дженериков - устранение необходимости в низкоуровневом управлении указателями - но имейте в виду внутренней работы.

3
ответ дан 1 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: