powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / const параметры
25 сообщений из 52, страница 2 из 3
const параметры
    #37807597
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly PodgoretskyНа эксперименты или на анализ ассемблерного кода можешь не ссылаться. 12599985
...
Рейтинг: 0 / 0
const параметры
    #37807656
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я раньше написал.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
const параметры
    #39697726
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, что поднимаю тему старую, просто не вижу смысла создавать новую.
Вопрос опять же по const.
Почитал, что разницы нет в этом коде:
Код: pascal
1.
2.
procedure RestoreBarManagerStream(const BarManager: TdxBarManager);
procedure RestoreBarManagerStream(BarManager: TdxBarManager);


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


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


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

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


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


Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров?
String не в счёт.
...
Рейтинг: 0 / 0
const параметры
    #39697732
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства
...
Рейтинг: 0 / 0
const параметры
    #39697733
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11ну кроме того, что const запрещает изменять свойства объекта.
Где такое сказано ?
...
Рейтинг: 0 / 0
const параметры
    #39697738
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал?

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

Код: pascal
1.
BarManager := nil;


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

Т.е. для Win64:
Интерфейсы

Строки

Записи

Массивы

Variant

Extended

Для Win32: Win64 +

Int64

Double (TDateTime)

Для мобильных платформ + объекты (ибо у них есть счетчик ссылок)
...
Рейтинг: 0 / 0
const параметры
    #39697740
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
const параметры
    #39697746
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrX11ну кроме того, что const запрещает изменять свойства объекта.
Где такое сказано ?

потерял ссылку... лень искать
...
Рейтинг: 0 / 0
const параметры
    #39697748
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovX11,

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

а разве когда передаёшь переменную string, то меняется адрес? или я не понял?
...
Рейтинг: 0 / 0
const параметры
    #39697749
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Билдере это. В Билдере нельзя, в Delphi - можно.
...
Рейтинг: 0 / 0
const параметры
    #39697750
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал?

я не прочитал, а сделал вывод самостоятельно
...
Рейтинг: 0 / 0
const параметры
    #39697753
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

наверное, ссылка на какого-нибудь выдумщика была.
...
Рейтинг: 0 / 0
const параметры
    #39697759
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
procedure RestoreBarManagerStream(const BarManager: TdxBarManager);
procedure RestoreBarManagerStream(BarManager: TdxBarManager);



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

Но в случае, если параметр имеет тип:
1. string, массив или variant: их длинна может быть не ограниченна, и копирование будет затратным. С Const копирования не будет.
2. Interface: каждый раз, когда его будут передавать в качестве параметра, его RefCount будет увеличиваться на 1, а при выходе из метода - уменьшаться на 1. В случае const этого происходить не будет.
3. Во всех остальных случаях, особой разницы нет. Копирование 4-16 байт не сделает разницы.
...
Рейтинг: 0 / 0
const параметры
    #39697761
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_const запрещает присваивать значение самому объекту

Код: pascal
1.
BarManager := nil;



аааа, я понял, свойства менять можно, но вот присваивать что-то самому объекту напрямую нельзя:
Код: pascal
1.
2.
3.
4.
5.
6.
...
var
  BarManager1: TdxBarManager;
begin
  BarManager := BarManager1;// ошибка
...
...
Рейтинг: 0 / 0
const параметры
    #39697765
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс.
На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса.
Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.

>>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?
...
Рейтинг: 0 / 0
const параметры
    #39697767
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11 >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?

Нет. Будет создана ещё одна ссылка на экземпляр этого класса.
...
Рейтинг: 0 / 0
const параметры
    #39697770
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс.
На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса.
Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.

>>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра.
Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const?
Переменной является ССЫЛКА на экземпляр.
...
Рейтинг: 0 / 0
const параметры
    #39697771
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
 BarManager: TdxBarManager
 BarManager1: TdxBarManager
 BarManager2: TdxBarManager
begin
  BarManager:=TdxBarManager.Create; //Создать экземпляр класса, и присвоить его адрес в BarManager
  BarManager1:=BarManager;  
  BarManager2:=BarManager; //Теперь все переменные ссылаются на один и тот же экземпляр класса.
  BarManger2.Free; //Уничтожит экземпляр класса и сделает все ссылки не него неверными.
end;
...
Рейтинг: 0 / 0
const параметры
    #39697773
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BНет. Будет создана ещё одна ссылка на экземпляр этого класса.
КотовасияПеременной является ССЫЛКА на экземпляр.

теперь доходит
...
Рейтинг: 0 / 0
const параметры
    #39697774
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Aleksandr SharahovX11,

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

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

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

Со строками работает магия компилятора.
Да, когда изменяешь символы строки, ее положение в памяти в общем случае может измениться. Но главное дело в магии.
...
Рейтинг: 0 / 0
const параметры
    #39697801
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В основном заповедь такая:
1) на простые типы (булевы, символы, числа, даже вещественные, указатели) const ничего не дает, т.к. все равно в подпрограмму передается копия
1.1) если указатель - это объект, то в режиме ARC (auto ref count, для мобильных платформ) см. правило для интерфейса
2) на все остальные (записи, массивы, строки, интерфейсы) - не помешает, и даже даст выигрыш производительности. Плюс защитит от класса ошибок типа procedure(s: string) begin s:='foo'; end
3) если параметр исключительно выходной, то лучше объявлять его out, а не var. var для тех, у кого читается значение на входе и меняется на выходе
...
Рейтинг: 0 / 0
const параметры
    #39697814
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, а слона-то я и не заметил спасибо
...
Рейтинг: 0 / 0
const параметры
    #39698718
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что это было?
...
Рейтинг: 0 / 0
const параметры
    #39698736
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

подготовка к пятнице.
...
Рейтинг: 0 / 0
const параметры
    #39698947
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger, ты про что именно?
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / const параметры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]