Кстати, у меня Find возвращает значение, если Pointer равен nullptr, ноо получив такой итератор стартовым, не делает ничего полезного, а ограничивается только проверкой и бросает исключение, если nullptr равен Owner. Если же nullptr валяется в Pointer итератора последнего элемента в диапазоне, то ищет до конца списка. И Insert, получив nullptr в Pointer исключение не бросает, а добавляет элемент за конец списка, если же nullptr валяется в Owner, то бросается исключение. И только сравнение и инкремент бросают исключение и если Pointer равен nullptr, и если nullptr равен Owner. Но разные. Под проверками Pointer==nullptr и Owner==nullptr
ни где нет одинакового кода.
Можете мне описать алгоритмическую оправданность генерации двух Ф-форм для N и для i вместо одной Ф-формы для переменной i?
А с какой стати я должен обосновывать то, что придумали Вы?
Это патент IBM от середины 80-х.
Во-первых у меня у самого 4 патента. А сколько у Вас, чтоб говорить, что чистая математика патентуется? Она не патентуется вообще. А во-вторых патент предназначен для защиты идеи от несанкционированного использования: патентообладатель заявляет государству, что именно он хочет сохранить в секрете, а государство требует, чтоб тот, кто даже узнал секрет, но не получил от патентообладателя разрешения на его использование, воздерживался от использования чужого секрета. Таким образом, патент на компилятор прямо противоречит тому, что
все компилятору устроены именно так. Сам патент запрещал бы без специального на то разрешения повторять за IBM.
Оператора инкремента в псевдоассемблере clang вообще нет.
1. Оператора в ассемблере, даже псевдо. Не смешно.
2. В системе команд процессорная инструкция инкремента есть и закодирована иначе, чем процессорная инструкция составного сложения и присваивания, а процессорной инструкции обычного сложения нет. Объясни, каким образом компилятор компилирует ++i в операцию именно инкремента и почему i=i+1 для оптимизации до INC требует анализа, без которого в худшем случае получится:
Код: Выделить всё
скопировать через регистр i во временную величину
загрузить её в регистр
сложить этот регистр с 1 инструкцией ADD
сохранить его назад в память
скопировать временную величину через регистр в память
, а в относительно хорошем:
Код: Выделить всё
скопировать i в регистровую временную величину, то есть просто отвести регистр для временного хранения копии i
сложить этот регистр с 1 инструкцией ADD
сохранить его назад в i
. При том, что счётчик цикла уже лежит в регистре и в память каждый раз не сохраняется, даже такой код коряв и его можно ещё улучшить до увеличения i инструкцией ADD, но:
2.1. Даже такая оптимизация уже требует анализа кода.
2.2. ADD требует загрузки второго операнда, из-за чего может выполняться медленнее, чем INC. И на старых камнях загрузка второго операнда выполнялась всегда после расшифровки кода операции, но до начала исполнения, что требовало минимум одного дополнительного такта, из-за чего INC и была введена в систему команд. Инкремент же компилируется просто в INC, которую улучшить уже нельзя.
Если скажешь, что компилятор способен скомпилировать i=i+1 в INC AX, оспаривать не буду, да вопрос не в том.