Директива компилятора для отключения проверки индексатора массива


#1

Предлагаю сделать директиву компилятора, позволяющую отключать проверку индексатора на выход за границы массива.

За:

  • Отключение проверки позволяет ускорить доступ к элементам массива в 2.5 раза

Против:

  • Спецэффекты вместо исключения в случае выхода за границы массива.
  • За добавление директивы
  • Против добавления директивы

0 голосов


#2

Если кому интересно, в Julia таковая есть.


#3

А Julia основана на .Net? Может от туда можно было бы решение взять, как они реализовали?


#4

Нет, не .NET, а LLVM.


#5

Паскаль - язык, задуманный для достаточно надежного программирования. У него строгая типизация, запрет на преобразования, которые могут повлечь потерю данных (например real -> integer) и т.п. И вдруг - отключение контроля границ массива! Мало проблем с арифметическими переполнениями в целочисленных, отсутствует контроль в диапазонных типах, так еще и это добавить? Ну и куда мы так придем?


#6

Ну, контроль переполнения и т.п. в основном режиме компилятора отсутствует, а добавить предлагается в директиву, это всё же не одно и то же.


#7

15 сообщений перенесены в новую тему: Неявное преобразование real → integer


#8

Да, можно выпустить модифицированный травматический пистолет со сменным механизмом и стволом, позволяющий опционально стрелять боевыми патронами. Но позволят ли?


#9

Главное, чтобы не узнали :grin:


#19

А КАК вы это делать собираетесь?


#21

Через указатели. Если нет возможности пользоваться ими для этого явно, можно заставить делать это компилятор.


#22

А что будете делать когда .NET переместит эту память в результате очередной сборки мусора?


#23

Для этого есть блокировки памяти. В C# это fixed.


#26

У меня есть идея сделать как то так:

begin
  
  var a := Arr(1,2,3);
  
  {$arrptr a}
  for var i:integer := 0 to a.Length-1 do
  begin
    a[i] := a[i]+1;
  end;
  
end.

Ожидается что в следующем за директивой блоке (то есть во всём for) доступ к элементам массива будет по указателю вместо стандартного. Ну и весь блок, конечно, в fixed.

Можно ещё специально для for оптимизировать, чтоб сотни указателей не создавать, а только прибавлять по 1 к указателю на каждой итерации.


#27

Для справки:


#28

Золотые слова! Браво! Давайте так и сделаем! :clap:


#31

4 сообщения перенесены в тему Неявное преобразование real → integer


#32

@Ulysses вы ещё не всё перенесли, дочистите пожалуйста))


#33

Не вижу ничего больше.


#34

Ладно. Вот код:

begin
  var n := 100000000;
  var a := new integer[n];
  var b: integer;
  Milliseconds;
  
  loop 10 do
  for var i:=0 to a.Length-1 do
    a[i] := i;
  
  Print(MillisecondsDelta);
end.

У меня в режиме Release при запуске по Shift-F9 он работает 1000 мс. В режиме Debug 2500

Ускорьте его на C# с использованием fixed и указателей