Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: const параметры  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5088
Anatoly Podgoretsky
На эксперименты или на анализ ассемблерного кода можешь не ссылаться.
12599985
23 май 12, 12:39    [12600211]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Я раньше написал.
23 май 12, 13:01    [12600443]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: const параметры  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Извините, что поднимаю тему старую, просто не вижу смысла создавать новую.
Вопрос опять же по const.
Почитал, что разницы нет в этом коде:
procedure RestoreBarManagerStream(const BarManager: TdxBarManager);
procedure RestoreBarManagerStream(BarManager: TdxBarManager);

ну кроме того, что const запрещает изменять свойства объекта.


Проверил: добавил строку
BarManager.StretchGlyphs := True;

и никаких ошибок компилятор не выдал.

И если const запрещает изменение объекта, то почему процедура
BarManager.LoadFromStream(stream);

выполняется тоже без проблем.


Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров?
String не в счёт.
4 сен 18, 13:25    [21663904]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1670
X11,

потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства
4 сен 18, 13:29    [21663917]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
DimaBr
Member

Откуда:
Сообщений: 10744
X11
ну кроме того, что const запрещает изменять свойства объекта.

Где такое сказано ?
4 сен 18, 13:29    [21663918]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
X11
ну кроме того, что const запрещает изменять свойства объекта.
Где ты такое прочитал?

const запрещает присваивать значение самому объекту

BarManager := nil;

X11
Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров?
Для типов, размер которых превышает машинное слово, чтобы избежать ненужного копирования в памяти и для типов, с управляемым временем жизни, чтобы избежать передергивания счетчика ссылок.

Т.е. для Win64:
  • Интерфейсы
  • Строки
  • Записи
  • Массивы
  • Variant
  • Extended

    Для Win32: Win64 +
  • Int64
  • Double (TDateTime)

    Для мобильных платформ + объекты (ибо у них есть счетчик ссылок)
  • 4 сен 18, 13:36    [21663930]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    DimaBr
    Member

    Откуда:
    Сообщений: 10744


    К сообщению приложен файл. Размер - 42Kb
    4 сен 18, 13:38    [21663934]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    DimaBr
    X11
    ну кроме того, что const запрещает изменять свойства объекта.

    Где такое сказано ?


    потерял ссылку... лень искать
    4 сен 18, 13:41    [21663942]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    Aleksandr Sharahov
    X11,

    потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства


    а разве когда передаёшь переменную string, то меняется адрес? или я не понял?
    4 сен 18, 13:42    [21663947]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    GunSmoker
    Member

    Откуда:
    Сообщений: 3078
    В Билдере это. В Билдере нельзя, в Delphi - можно.
    4 сен 18, 13:43    [21663949]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    _Vasilisk_
    X11
    ну кроме того, что const запрещает изменять свойства объекта.
    Где ты такое прочитал?


    я не прочитал, а сделал вывод самостоятельно
    4 сен 18, 13:43    [21663951]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    X11,

    наверное, ссылка на какого-нибудь выдумщика была.
    4 сен 18, 13:43    [21663954]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Valery_B
    Member

    Откуда: Москва
    Сообщений: 1807
    X11,

    procedure RestoreBarManagerStream(const BarManager: TdxBarManager);
    procedure RestoreBarManagerStream(BarManager: TdxBarManager);
    


    В приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс.
    На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса.
    Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.

    Но в случае, если параметр имеет тип:
    1. string, массив или variant: их длинна может быть не ограниченна, и копирование будет затратным. С Const копирования не будет.
    2. Interface: каждый раз, когда его будут передавать в качестве параметра, его RefCount будет увеличиваться на 1, а при выходе из метода - уменьшаться на 1. В случае const этого происходить не будет.
    3. Во всех остальных случаях, особой разницы нет. Копирование 4-16 байт не сделает разницы.
    4 сен 18, 13:48    [21663970]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    _Vasilisk_
    const запрещает присваивать значение самому объекту

    BarManager := nil;
    


    аааа, я понял, свойства менять можно, но вот присваивать что-то самому объекту напрямую нельзя:
    ...
    var
      BarManager1: TdxBarManager;
    begin
      BarManager := BarManager1;// ошибка
    ...
    
    4 сен 18, 13:48    [21663972]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    Valery_B
    В приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс.
    На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса.
    Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.


    >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
    Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?
    4 сен 18, 13:52    [21663977]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Valery_B
    Member

    Откуда: Москва
    Сообщений: 1807
    X11
    >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
    Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?


    Нет. Будет создана ещё одна ссылка на экземпляр этого класса.
    4 сен 18, 13:53    [21663980]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    X11
    Valery_B
    В приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс.
    На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса.
    Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.


    >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
    Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?

    Переменной является ССЫЛКА на экземпляр.
    4 сен 18, 13:57    [21663989]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Valery_B
    Member

    Откуда: Москва
    Сообщений: 1807
    X11,

    var
     BarManager: TdxBarManager
     BarManager1: TdxBarManager
     BarManager2: TdxBarManager
    begin
      BarManager:=TdxBarManager.Create; //Создать экземпляр класса, и присвоить его адрес в BarManager
      BarManager1:=BarManager;  
      BarManager2:=BarManager; //Теперь все переменные ссылаются на один и тот же экземпляр класса.
      BarManger2.Free; //Уничтожит экземпляр класса и сделает все ссылки не него неверными.
    end;
    
    4 сен 18, 13:58    [21663993]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    Valery_B
    Нет. Будет создана ещё одна ссылка на экземпляр этого класса.

    Котовасия
    Переменной является ССЫЛКА на экземпляр.


    теперь доходит
    4 сен 18, 14:00    [21663999]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Aleksandr Sharahov
    Member

    Откуда: Москва
    Сообщений: 1670
    X11
    Aleksandr Sharahov
    X11,

    потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства


    а разве когда передаёшь переменную string, то меняется адрес? или я не понял?


    const запрещает менять переданное, а объект передается как адрес.
    Когда изменяешь свойства объекта, его положение в памяти не меняется.
    Изменить объект = присвоить значение самому объекту, и его положение в памяти в общем случае может измениться.

    Со строками работает магия компилятора.
    Да, когда изменяешь символы строки, ее положение в памяти в общем случае может измениться. Но главное дело в магии.
    4 сен 18, 14:00    [21664001]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 234
    В основном заповедь такая:
    1) на простые типы (булевы, символы, числа, даже вещественные, указатели) const ничего не дает, т.к. все равно в подпрограмму передается копия
    1.1) если указатель - это объект, то в режиме ARC (auto ref count, для мобильных платформ) см. правило для интерфейса
    2) на все остальные (записи, массивы, строки, интерфейсы) - не помешает, и даже даст выигрыш производительности. Плюс защитит от класса ошибок типа procedure(s: string) begin s:='foo'; end
    3) если параметр исключительно выходной, то лучше объявлять его out, а не var. var для тех, у кого читается значение на входе и меняется на выходе
    4 сен 18, 14:44    [21664096]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    DimaBr, а слона-то я и не заметил спасибо
    4 сен 18, 15:04    [21664125]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    white_nigger
    Member

    Откуда: Тула
    Сообщений: 1928
    Что это было?
    5 сен 18, 19:33    [21666196]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    white_nigger,

    подготовка к пятнице.
    5 сен 18, 20:19    [21666235]     Ответить | Цитировать Сообщить модератору
     Re: const параметры  [new]
    X11
    Member

    Откуда: Kharkiv, Ukraine
    Сообщений: 12480
    white_nigger, ты про что именно?
    6 сен 18, 12:40    [21666798]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
    Все форумы / Delphi Ответить