ОС устанавливает обработчик ошибок, который вызывается, если доступ к памяти нарушает правила, налагаемые ОС, - например, доступ к нулевому адресу. Если ваша программа собирается разыменовать нулевой указатель, этот обработчик ошибок вызывается, и программа будет завершена до того, как она обратится к области запрещенной памяти. Таким образом, ваша программа на самом деле никогда не разыскивает нулевой указатель, она улавливается при попытке.
Механизм обнаружения запрещенных обращений к памяти часто выполняется с помощью аппаратной поддержки, такой как таблицы страниц или сегментации памяти.
Если сам ядро ОС разыскивает нулевой указатель, он обычно останавливается при попытке сделать это. Вы получите синий экран, ядро или т. П. Если это продолжается, это может привести к «неопределенному поведению».
Обратите внимание, что термин «неопределенное поведение» точно определен только на языках C или аналогичных языках, на самом деле, происходит, если вы пытаетесь получить доступ к области памяти, для которой у вас недостаточно прав, очень хорошо определены в контексте архитектуры.
Ваш код является absolutety штрафом.
IN
похож на набор X=Y
присоединенный с OR
и довольно быстр в современных базах данных.
Однако, если Ваш список идентификаторов длинен, Вы могли бы сделать запрос немного более эффективным путем передачи подзапроса, возвратив список идентификаторов.
Я рекомендовал бы смотреть на SQL, который это производит. Можно просто распечатать str (запрос) для наблюдения его.
я не знаю об идеальном способе сделать его со стандартным SQL.