Есть ли какие-либо преимущества в использовании параметров константы с перечислимым типом?

Попробуйте это: DGrok - грамматика Дельфи

33
задан Daniel Rikowski 27 November 2013 в 16:09
поделиться

4 ответа

Вам нужно понять причину, чтобы избежать "программирования культа карго". Пометка строк как const влияет на производительность, потому что вам больше не нужно использовать взаимосвязанное увеличение и уменьшение числа ссылок в строке, операция, которая фактически становится дороже, а не меньше, с течением времени на , потому что большее количество ядер означает больше работы, которая должна выполняться для обеспечения синхронизации атомарных операций. Это безопасно, так как компилятор применяет ограничение «эта переменная не будет изменена».

Для порядковых чисел, которые обычно составляют 4 байта или меньше, прирост производительности не наблюдается. Использование const в качестве оптимизации работает только тогда, когда вы используете типы значений, размер которых превышает 4 байта, например массивы или записи, или типы с подсчетом ссылок, такие как строки и интерфейсы.

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

46
ответ дан 27 November 2019 в 17:58
поделиться

It depends on how complex is your routine and how it is used. If it is used many places and required that the value stay the same, declare it as "const" to make it cleared and safe. For string type, there was a bug (for Delphi 7 as I stump on it) that causes memory corruption if declare as "const". Below is sample codes

type
  TFoo = class 
  private
     FStr: string;
  public
     procedure DoFoo(const AStr: string);
     begin
        FStr := AStr; //the trouble code 1
        ......
     end;
     procedure DoFoo2;
     begin
        .....
        DoFoo(FStr);  //the trouble code 2
     end;
  end;
1
ответ дан 27 November 2019 в 17:58
поделиться

Declaring ordinal types const makes no difference because they are copied anyway (call-by-value), so any changes to the variable do not affect the original variable.

procedure Foo (Val : Integer)
begin
Val := 2;
end;
...
SomeVar := 3;
Foo (SomeVar);
Assert (SomeVar = 3);

IMHO declaring ordinal types const makes no sense and as you say requires you to introduce local variables often.

8
ответ дан 27 November 2019 в 17:58
поделиться

Вы не можете случайно обработать их как параметры var и скомпилировать свой код. Так что это проясняет ваши намерения.

18
ответ дан 27 November 2019 в 17:58
поделиться
Другие вопросы по тегам:

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