Если вы когда-либо наблюдали какое-либо неопределенное поведение при написании кода на C/C++, вы можете удивиться, почему C/C++ допускает такое поведение. Здесь, в этой статье, мы собираемся обсудить идею, стоящую за этим. Но подождите, что такое неопределенное поведение?

Хорошо, позвольте мне дать простой обзор неопределенного поведения, который поможет нам ясно понять концепции.

Неопределенное поведение в C/C++: в компьютерном программировании неопределенное поведение — эторезультат выполнения программы, поведение которой предписано быть непредсказуемым в спецификации языка, к которой относится компьютер. код придерживается.

Ммм… Звучит довольно теоретически, верно? Неопределенное поведение — это один из тех аспектов языка C и C++, который может удивить программистов, пришедших с других языков (где другие языки пытаются скрыть это лучше).

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

Все еще в замешательстве! Давайте посмотрим несколько примеров-

Давайте попробуем запустить приведенный ниже код, где мы выходим за пределы подписанного int-

Вывод: x + 1: -2147483648

Привет! Мы получили минимальное количество подписанных int. Потому что мы просто перешли предел.

Хм, это одно из Неопределенных Поведений в C/C++. См. некоторые другие подобные поведения-

Вывод: значение false (в ваших компиляторах оно может отличаться!)

Некоторые другие такие примеры: Выполнение деления на 0, Доступ к значению NULL, Доступ к массиву за пределами границ, Попытка изменить строковый литерал и т. д.

До сих пор у вас может быть понимание неопределенного поведения. Итак, теперь давайте попробуем ответить на наш вопрос «Почему C/C++ допускает неопределенное поведение?»

Ждать! Если вы заметили определение, которое я сказал «Другие языки пытаются скрыть это лучше» , то вы можете подумать, что это ошибка C/C++, поскольку это старый язык. Но не совсем. Вот почему-

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

Например, если вы выделяете массив в C, данные не определены. В Java все байты должны быть инициализированы 0 (или другим указанным значением). Это означает, что среда выполнения должна пройти через массив (операция O(n)), в то время как C может выполнить выделение в одно мгновение. Так что C всегда будет быстрее для таких операций.

Если код, использующий массив, все равно заполнит его перед чтением, это в основном напрасная трата усилий для Java. Но в случае, когда код читается первым, вы получаете предсказуемые результаты в Java, но непредсказуемые результаты в C. Так что вы можете получить ответ до сих пор.

Другие преимущества:

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

У нас также есть еще одно преимущество, поскольку это позволяет нам хранить значение переменной в регистре процессора и манипулировать им в течение времени, которое больше, чем переменная в исходном коде. Это также помогает в циклических проверках, а затем во время компиляции, что было бы невозможно без более глубокого знания неопределенного поведения в компиляторе C/C++.

Привет! Вам понравилась тема?

Если да, то не забудьте подписаться на exploreIT, так как я регулярно прихожу с интересными темами, связанными с программированием и, конечно же, если у вас есть любые трудности с пониманием концепций или обнаружение ошибок в статье, пожалуйста, не стесняйтесь комментировать ниже!

Увидимся в следующей статье, пока, пока!