Здравствуйте, gandjustas, Вы писали:
V>>Считается наоборот. Код с дырами в безопасности не может быть оптимальным. G>Не понял о чем ты. Представь типичную программу на C++ до C++11, теперь прикинь сколько и где надо добавить проверок в рантайме, чтобы исключить обращения к освобожденной памяти?
А что изменилось после C++11 в этом плане? Это такой же дырявый язык по-умолчанию, как и C#.
Протягивать динамику в статику можно только через зависимые типы. В этом случае некая проверка происходит лишь однажды, при "динамическом преобразовании" неких исходных данных (взятых с IO, скажем) в "типизированную версию", а затем все гарантии распространяются автоматом, не требуя дальнейших проверок в рантайме. Именно отсюда растут ноги эффективности — из ГАРАНТИЙ безопасности.
Но С++ закрывает хотя бы часть амбразуры, если размерности массивов известны в compile-time. Т.е. можно так построить систему типов, чтобы протянуть всю безопасность далее по вызовам, сделав ненужным лишние проверки в каждом публичном методе. Например, хорошо это ложится на обработку данных порциями — мы выбираем размер порции в design-time, а затем в рантайм обрабатываем данные этими порциями, где все динамические проверки происходят аккурат в момент заполнения некоего начального "типизированного" буфера. Ну а далее будет уже как в языках с зависимыми типами — вся обработка будет уже без лишних проверок. К тому же это очень эффективно, т.к. все циклы задаются константными счетчиками, т.е. раскрутка цикла или операция сравнения на выход из цикла происходят в самых благоприятных для компилятора условиях.