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

Упадёт несомненно, причем, когда она будет работать у того, кто купил программу.

А с чего Вы решили, что не упадет?

Проблема в другом - если Вы налезете на свою память и запишете туда новые значения. Программа продолжит работать, и исключения не будет. Но всё, что она будет далее считать, будет неверно.

Даже если она упадёт, что изменится для конкретного пользователя. Что поменяет для пользователя название исключения?

Если исключения не будет при ошибке, но программа продолжит считать, то эффект не заставит себя долго ждать. Для этого есть тесты. А если этого не обнаружили тесты, то не важно, в каком виде будет ошибка. Обращение к элементам по указателям не меняет структуру программы, это важно понимать. В конце концов, ничто не мешает проверять программу со стандартным индексатором, а после того, как появится уверенность в отсутствии ошибок, поставить директиву и работать по указателям. Это ведь почти то - же самое, что Debug/Release.

Это если всюду отрубить проверку границ. А если отрубить её к примеру тут:

begin
  var c := 10;
  var a := new byte[c];
  for var i := 0 to c-1 do
    a[i] := i;
end.

Тут программа никак упасть не может. Всегда есть места в которых можно быть уверенным что всё будет в порядке. И 20% того очень даже стоят, раз то что делал @Gleb уже считалось более минуты (и это ведь готовый вариант, обучение на много дольше).

1 лайк

Согласен. А тут?

begin
  var c := 10;
  var a := new byte[c];
  ...
  for var i := 0 to c-1 do
    a[i] := i;
end.

Вместо многоточия - ваша фантазия

Вам уже ответили. Зачем вообще заниматься программированием, если постоянно сомневаться в чём то, несмотря на то, что ошибка не приведёт к потерям?

Это уже проблема программиста, будет ли на месте троеточия то что не стоит ставить. Кроме всего прочего, поставить последней строчкой в троеточии if c > a.Length then raise new Exception решит все проблемы.

Я бы вообще не ставил бы ничего на месте троеточия, чтоб точно быть увереным.

1 лайк

Обучение MnistNet заняло 16 часов. После оптимизации кода на C# - примерно в 2 раза меньше.

Фантазия бывает и извращённой. Там никакие проверки не помогут.

Я уже тыщу раз повторил, что использование директивы - ОСОЗНАННЫЙ ВЫБОР программиста. Никто не обяжет её использовать. В C# есть модификатор unsafe. Только он позволяет использовать указатели в любом их виде. А ещё надо поставить параметр компилятора unsafe - иначе нельзя. В итоге есть возможность 2 раза обдумать свои действия. Что мешает сделать подобное в Паскале?

1 лайк

Да просто по молодости лет не нарывался еще. Если бы писал программу, к примеру, для банковских транзакций, где ошибка вполне способна закинуть средства на другой счет, а средства измеряются числами с очень большим числом разрядов, может и подумал бы, как будет персонально возмещать потерю от такой трансакции, если получатель откажется возвратить зачисленную сумму (а по закону ее невозможно принудительно взыскать). Или программу в составе комплексного управления чем-либо серьезным, когда за сбой можно просто попасть ко взрослым суровым дядям и там доказывать, что это было не намеренно. А так, пока это развлекушки для души, до человека не дойдет, что такое ответственность за свои действия.

Не все программы банковские. В том же ИИ важнее скорость чем безопасность.

И ещё раз, не во всех программах нельзя точно быть уверенным что не упадёт.

1 лайк

Не все работают над банковскими переводами или управлением ракетами. Если Вас интересуют чисто математические задачи, то большие массивы там вряд ли нужны. А программисты C++, по-Вашему, безответственные люди? РЖАЧ ДО СЛЁЗ!

1 лайк

Безопасность важна всегда. Это Вам любой специалист в области защиты данных скажет. А не послушаете - будете искать работу там, где “безопасников” нет.

Да Вы издеваетесь что ли? Шанс налепить ошибок гораздо выше если постоянно бояться их. Что за истерика то вообще?

Давайте переведем дискуссию в более спокойное русло.

Попытка оптимизации проверки индексов - это дело интересное. Даже ускорение на 20% вполне заслуживает того.

Несомненно, в .NET и Java не случайно всегда проверяются индексы. Но я понимаю, что игнорировать опыт, накопленный программистским человечеством, свойственно молодёжи. Свои ошибки - они - самые запоминающиеся.

Делать это в PascalABC.NET мы конечно не будем. По разным причинам. Основная - это ниша PascalABC.NET. Образовательная и академическая. Еще - небольшие проекты, разрабатываемые энтузиастами Паскаля.

Для создания высокоэффективных приложений есть другие языки и среды.

А unsafe в C# значит случайно?

1 лайк

Мы не делаем новый C#

Указатели есть во всех языках, но вот их неэффективность только здесь. Есть повод задуматься…