|
|
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Anatoly PodgoretskyНа эксперименты или на анализ ассемблерного кода можешь не ссылаться. 12599985 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:39 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Извините, что поднимаю тему старую, просто не вижу смысла создавать новую. Вопрос опять же по const. Почитал, что разницы нет в этом коде: Код: pascal 1. 2. ну кроме того, что const запрещает изменять свойства объекта. Проверил: добавил строку Код: pascal 1. и никаких ошибок компилятор не выдал. И если const запрещает изменение объекта, то почему процедура Код: pascal 1. выполняется тоже без проблем. Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров? String не в счёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:25 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:29 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11ну кроме того, что const запрещает изменять свойства объекта. Где такое сказано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:29 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал? const запрещает присваивать значение самому объекту Код: pascal 1. X11 Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров? Для типов, размер которых превышает машинное слово, чтобы избежать ненужного копирования в памяти и для типов, с управляемым временем жизни, чтобы избежать передергивания счетчика ссылок. Т.е. для Win64: Интерфейсы Строки Записи Массивы Variant Extended Для Win32: Win64 + Int64 Double (TDateTime) Для мобильных платформ + объекты (ибо у них есть счетчик ссылок) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:36 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
DimaBrX11ну кроме того, что const запрещает изменять свойства объекта. Где такое сказано ? потерял ссылку... лень искать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:41 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovX11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства а разве когда передаёшь переменную string, то меняется адрес? или я не понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:42 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
В Билдере это. В Билдере нельзя, в Delphi - можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал? я не прочитал, а сделал вывод самостоятельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, наверное, ссылка на какого-нибудь выдумщика была. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, Код: pascal 1. 2. В приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Но в случае, если параметр имеет тип: 1. string, массив или variant: их длинна может быть не ограниченна, и копирование будет затратным. С Const копирования не будет. 2. Interface: каждый раз, когда его будут передавать в качестве параметра, его RefCount будет увеличиваться на 1, а при выходе из метода - уменьшаться на 1. В случае const этого происходить не будет. 3. Во всех остальных случаях, особой разницы нет. Копирование 4-16 байт не сделает разницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:48 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_const запрещает присваивать значение самому объекту Код: pascal 1. аааа, я понял, свойства менять можно, но вот присваивать что-то самому объекту напрямую нельзя: Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:48 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:52 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11 >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? Нет. Будет создана ещё одна ссылка на экземпляр этого класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:53 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? Переменной является ССЫЛКА на экземпляр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:57 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:58 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Valery_BНет. Будет создана ещё одна ссылка на экземпляр этого класса. КотовасияПеременной является ССЫЛКА на экземпляр. теперь доходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:00 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11Aleksandr SharahovX11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства а разве когда передаёшь переменную string, то меняется адрес? или я не понял? const запрещает менять переданное, а объект передается как адрес. Когда изменяешь свойства объекта, его положение в памяти не меняется. Изменить объект = присвоить значение самому объекту, и его положение в памяти в общем случае может измениться. Со строками работает магия компилятора. Да, когда изменяешь символы строки, ее положение в памяти в общем случае может измениться. Но главное дело в магии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:00 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
В основном заповедь такая: 1) на простые типы (булевы, символы, числа, даже вещественные, указатели) const ничего не дает, т.к. все равно в подпрограмму передается копия 1.1) если указатель - это объект, то в режиме ARC (auto ref count, для мобильных платформ) см. правило для интерфейса 2) на все остальные (записи, массивы, строки, интерфейсы) - не помешает, и даже даст выигрыш производительности. Плюс защитит от класса ошибок типа procedure(s: string) begin s:='foo'; end 3) если параметр исключительно выходной, то лучше объявлять его out, а не var. var для тех, у кого читается значение на входе и меняется на выходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:44 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
DimaBr, а слона-то я и не заметил спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 15:04 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
white_nigger, подготовка к пятнице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 20:19 |
|
||
|
|

start [/forum/topic.php?fid=58&startmsg=37807597&tid=2040444]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
179ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 455ms |

| 0 / 0 |
