Почему современные компиляторы не улавливают попытки сделать за пределами доступа доступ к массивам? - PullRequest
0 голосов
/ 18 апреля 2020

Если int arr [5] инициализируется, но хранится более 5 элементов, то дополнительный элемент получает память, выделенную в отдельном пространстве. Старые компиляторы, такие как turbo, сообщали, что cra sh как-то перезаписано. Но с современными компиляторами этого не происходит, так как они справляются с этой проблемой?

1 Ответ

2 голосов
/ 18 апреля 2020

Ну, я перешел, чтобы открыть снова, поэтому я думаю, что я должен написать что-то из ответа:

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

Обременительная система во время выполнения проверяет доступ за пределы. То есть каждая такая проверка требует вычисления того, к какому индексу следует обращаться, а затем проверки того, что этот индекс находится в границах; все это в дополнение к «нормальным» операциям.

Чтобы увидеть влияние этого, возьмите программу, интенсивно использующую массив, и скомпилируйте ее без проверки границ во время выполнения, а также с проверкой границ во время выполнения и сравните скорости выполнения.

Похоже, что широко используемые языки, которые компилируются ( например C, C ++, Fortran), решили по умолчанию не генерировать проверку границ массива. Но их компиляторы предоставляют возможность генерировать код с проверкой границ массива.

(Историческая диверсия: у меня есть скрытое подозрение, что в первые дни C изо всех сил пытался осуществить проверку границ массива во время выполнения, так как он едва различал массивы и указатели, и я Я не уверен, что всегда знал, какие были границы массива при выполнении кода. С другой стороны, Fortran использует допинг-вектор , который включает в себя размер массива. Возможно, кто-то более знающий, чем я мог поправьте меня.)

Почему один язык по умолчанию не проверяет границы массивов во время выполнения, а другой - проверку по умолчанию, это вопрос разработчиков языка.

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

И вы можете работать с таким языком или нет.

...