Главная /
Программирование /
Оптимизация приложений с использованием компиляторов Intel. Уровень 2
Оптимизация приложений с использованием компиляторов Intel. Уровень 2 - ответы на тесты Интуит
Правильные ответы выделены зелёным цветом.
Все ответы: Данная сертификация проверяет знания оптимизации программ при помощи инструментов Intel.
Все ответы: Данная сертификация проверяет знания оптимизации программ при помощи инструментов Intel.
Тактовая частота процессора это
(1) частота, с которой работает таймер компьютера, посылающий синхроимпульсы микросхемам
(2) величина, кратная частоте, с которой работает таймер компьютера
(3) время выполнения самой быстрой команды
(4) минимальный квант времени вычислений
(5) частота синхроимпульса, которую посылает таймер
Определенный участок памяти внутри ЦП, используемый для хранения информации, обрабатываемой процессором это
(1) оперативная память
(2) системные регистры
(3) системная шина
Какие функции выполняет Sampling?
(1) определение проблемных мест в коде программы
(2) показывает распределение работы по потокам
(3) определение проблем производительности на уровне микроархитектуры
(4) производит бинарную инструментацию пользовательской программы
Набор
Uses[b]
, конструирующийся для def-use chain, содержит:
(1) набор переменных, определяемых в блоке
(2) набор переменных, использующихся в блоке, и не имеющие в нем определений
(3) набор определений, достигающих b
Базовые блоки составляют
(1) граф потока управления
(2) граф базовых блоков (base block graph)
(3) базовый граф вычислений
(4) граф вычислений
(5) опорный граф вычислений
Для чего предназначен Loop Stream Detector?
(1) позволяет разбивать большие циклы на последовательность циклов меньшего размера
(2) позволяет избавиться от циклов
(3) позволяет ускорить исполнение циклов
(4) позволяет отказаться от выборки и декодирования инструкций для маленьких циклов
Какая оптимизация является обратной к объединению циклов?
(1) вынесение условных переходов
(2) расщепление цикла
(3) перестановка циклов
(4) развертка цикла
(5) разбиение цикла
Какие из следующих опций позволят программе работать на любом процессоре?
(1) -QxSSE4_1
(2) -arch:SSE3
(3) -QaxSSE3_1
(4) -QxSSE3
(5) -arch:SSE2_2
(6) -QaxSSE4_2
(7) -QxSSE2
Выберите свойство, характеризующее вычислительную систему с распределенной памятью:
(1) каждый процессор полностью автономен. Существует некоторая коммуникационная среда
(2) все процессоры равноудалены от памяти. Связь с памятью осуществляется через общую шину данных
(3) память физически распределена между процессорами. Единое адресное пространство поддерживается на аппаратном уровне
Какой оптимизацией является автопараллелизация в компиляторе Интел?
(1) цикловой неперестановочной
(2) нецикловой перестановочной
(3) цикловой перестановочной
(4) нецикловой неперестановочной
При использовании технологии OpenMP поведение переменных следующее:
(1) в блоках переменных все переменные в разных потоках имеют собственный адрес и не перекрываются
(2) все переменные внутри блоков имеют один адрес. необходимо вручную заниматься проблемами одновременного доступа
(3) есть возможность указать, какие переменные имеют один адрес, а какие - разный
Какую информацию отражают ребра в графе вызовов?
(1) вложенность синтаксических конструкций
(2) использование одной функции из другой
(3) вызовы программ
(4) вызовы системных утилит
(5) системные вызовы
Что такое анализ совмещений?
(1) анализ, при котором совмещается информация различных процедур
(2) анализ, совмещенный с построением
(3) поиск переменных, которые могут обозначать одинаковую область памяти
(4) поиск функций с пересекающимся временем работы
(5) поиск и анализ функций, исполняемых одновременно
Что понимается под устранением неоднозначности при работе с памятью?
(1) выделение объектов, которые могут пересекаться по памяти
(2) выделение объектов, которые занимают слишком много памяти
(3) выделение объектов, которые могут оказаться не инициализированными
В чем недостаток статического профилировщика
(1) работа только со статическими переменными
(2) не обрабатывает переменные типа указатель
(3) не поддерживает типизацию в полном виде
(4) грубая оценка весов переходов
(5) необходимость повторного запуска перед выполнением
Выберите верные утверждения
(1) кодогенератор выравнивает базовые блоки в памяти
(2) кодогенератор помогает генерации исходного кода больших проектов
(3) кодогенератор выполняет специфические архитектурные оптимизации
(4) кодогенератор генерирует недостающие фрагменты функций
Выберите верное утверждение
(1) механизм упреждающей выборки стремится определить закономерность в доступе к памяти, чтобы заранее подгружать нужные данные в кэш
(2) механизм кэширования использует принцип пространственной локальности, т. Е. использует данные, имеющие близкие области хранения
(3) кэш алиасинг — из-за благоприятного расположения в памяти различных объектов, в кэш заранее подгружается необходимая информация, что уменьшает нагрузку на системную шину
Механизм упреждающей выборки (hardware prefetching) необходим для
(1) распараллеливания вычислений
(2) предсказания, какие данные понадобятся для исполнения программы и загрузки их в кэш
(3) увеличения пропускной способности процессора
За что отвечает Counter monitor?
(1) за обнаружение критических участков памяти и соотнесение их с критическими участками кода
(2) за подсчет общего количества событий, без привязки к месту в программе, их вызвавших
(3) за сбор данных о последовательности вызовов функций
Для понимания, какие определения будут использоваться в блоке, необходимо знать:
(1)
Uses[b]
(2)
Killed[b]
(3)
Reaches[b]
(4)
Defsout[b]
К базовым блокам относятся
(1) блоки входа
(2) сигнатуры функций
(3) тела всех функций, которые производят основные вычисления
(4) тела функций main и ей подобные
(5) заголовочные файлы системных библиотек
Укажите условия, необходимые для применения большинства оптимизаций циклических конструкций
(1) циклы должны иметь определенное количество итераций
(2) циклы не должны иметь переходов за пределы цикла
(3) в цикле не должны быть использованы условные операторы
(4) в циклах не должно быть вызовов неизвестных функций
Выберите фрагмент кода, получаемый после применения оптимизации расщепления цикла на заданном цикле:
p = 10;
for (i=0; i<10; ++i) {
y[i] = x[i] + x[p];
p = i;
}
(1) p = 10;
for (i=1; i<9; ++i) {
y[i] = x[i] + x[p];
p = i;
}
(2) y[0] = x[0] + x[10];
for (i=1; i<10; ++i) {
y[i] = x[i] + x[i-1];
}
(3) y[0] = x[0] + x[10];
for (i=1; i<9; ++i) {
y[i] = x[i] + x[i-1];
}
Могут ли четыре несвязанные явным образом переменные исходной программы быть компонентами одного вектора в результате преобразования векторизации?
(1) никогда
(2) могут
(3) только если между ними может быть установлен строгий лексикографический порядок
(4) только для операции сложения
(5) только для операции умножения
Выберите свойство характеризующее вычислительную систему с общей памятью:
(1) каждый процессор полностью автономен. Существует некоторая коммуникационная среда
(2) все процессоры равноудалены от памяти. Связь с памятью осуществляется через общую шину данных
(3) память физически распределена между процессорами. Единое адресное пространство поддерживается на аппаратном уровне
Действительно ли определение выгодности автопараллелизации – сложная задача?
(1) да, потому что существуют эффекты производительности, которые сложно оценить
(2) да, потому что компилятор может не иметь представления о количестве итераций в цикле
(3) нет, потому что автопараллелизация – цикловая неперестановочная оптимизация
(4) нет, потому что все необходимые данные для принятия решения доступны во время компиляции
OpenMP использует следующую модель распараллеливания:
(1) модель
refork
: каждый раз при начале параллельного цикла создаются новые потоки
(2) модель
fork-join
: потоки создаются при первом вызове параллельного потока; каждый следующий раз используются уже созданные
(3) модель queue: все задачи записываются в очередь; создаются несколько "исполнителей"-потоков и выполняют задачи, которые есть в очереди
По какой причине граф вызовов может являться не полным?
(1) используются библиотеки, свойства функций которых неизвестны
(2) используются переменные типа "указатель"
(3) используется однократное присваивание
(4) неизвестна полная статистика вызовов
(5) неизвестна статистика по системным вызовам
Совмещение (выявляемое при анализе совмещений) может возникнуть между
(1) любыми переменными
(2) только переменными типа "указатель"
(3) любыми функциями
(4) любыми программами
Что принимается во внимание при устранении неоднозначности при работе с памятью?
(1) особенности языка
(2) Local Point To анализ
(3) результаты межпроцедурного анализа
(4) анализ производительности приложения
(5) аттрибуты и директивы установленные разработчиком
На основании какой информации статический профилировщик оценивает веса переходов
(1) входные данные
(2) анализ базовых блоков
(3) межпроцедурный анализ
(4) инлайнинг-анализ
(5) статистика запусков
Граф несовместимости строится
(1) в процессе распределения регистров
(2) для обратной кодогенерации
(3) только для некорректно определенного кода
(4) только для кода, который не проходит репрезентативную выборку
Способность процессора выполнять несколько операций за один такт это
(1) векторизация
(2) упреждающая выборка
(3) суперскалярность
(4) конвейеризация
(5) гиперпоточность
При исполнении с изменением последовательности операций (out-of-order execution) инструкции выполняются
(1) по мере поступления в конвейер
(2) по мере готовности
(3) согласно предсказателю переходов
Какое событие отвечает за количество тактов
процессора?
(1)
L2_LINES_IN.SELF.DEMAND
(2)
BUS_TRANS_ANY.ALL_AGENTS
(3)
CPU_CLK_UNHALTED.CORE
(4) ничего из вышеперечисленного
Граница доминирования – это
(1) граница между доминируемыми и недоминируемыми узлами
(2) граница между доминируемыми и доминирующими узлами
(3) список вершин, доминируемых данной
Какие из нижеперечисленных утверждений верны?
(1) утверждение это наименьший независимый элемент языка программирования
(2) программа формируется как последовательность утверждений
(3) переменная это элементарное утверждение
(4) утверждение могут быть упорядочены лексически или в соответствии с графом потока
(5) утверждение это дерево утверждений
(6) утверждение состоит из выражений
Выберите фрагменты кода, пригодные для большинства цикловых оптимизаций
(1) for(i=0;i<U;i++)
a[i]=b[i];
(2) i=0;
do {
a[i]=b[i];
i++; } while(i<U);
(3) for(i=0;i<U;i++) {
a[j]=b[i];
j+=c*i; }
(4) for(i=0;i<n;i++) {
a[i]=i;
if(i<t) break;
}
Для чего используется полная развертка?
(1) нет такой оптимизации
(2) для развертки небольших циклов
(3) для развертки больших циклов
Что такое упакованный тип данных?
(1) тип данных, не содержащий незначащие нули
(2) тип данных, упакованный методом Хаффмана
(3) специальный тип, применяемый при архивировании
(4) тип данных, составляющий вектор
(5) тип данных, составляющий скаляр
Выберите свойство характеризующее вычислительную систему с неоднородным доступом к памяти:
(1) каждый процессор полностью автономен. Существует некоторая коммуникационная среда
(2) все процессоры равноудалены от памяти. Связь с памятью осуществляется через общую шину данных
(3) память физически распределена между процессорами. Единое адресное пространство поддерживается на аппаратном уровне
Как реализуется параллелизация цикла с помощью функции в компиляторе Intel?
(1) запускаются несколько экземпляров функции в разных потоках с различными значениями границ цикла
(2) итерационное пространство цикла разбивается на несколько частей и каждый поток обрабатывает свою часть итерационного пространства
(3) запускаются несколько экземпляров функции в одном потоке с различными значениями границ цикла
(4) итерационное пространство цикла разбивается на несколько частей и каждый поток последовательно обрабатывает части итерационного пространства
Для распараллеливания цикла нужно использовать:
(1)
#pragma omp parallel for
(2)
#pragma omp parallel while
(3)
#pragma omp single
(4)
#pragma omp set parallel for
Статический граф вызовов это
(1) вызовы программы на репрезентативной выборке данных
(2) граф вызовов без учета динамических переменных
(3) граф вызовов, построенный на этапе компиляции программы
(4) граф вызовов, построенный статистически
(5) такое понятие как статический граф вызовов не определяется в рамках курса
Анализ указателей (points to analysis) это
(1) и есть анализ совмещений
(2) часть анализа совмещений
(3) анализ индексных переменных
(4) анализ инвариантов циклов
(5) ничего из перечисленного
В каком случае невозможны перестановочные оптимизации?
(1) если есть объекты, которые могут не находиться в памяти
(2) если есть объекты, которые могут пересекаться по памяти
(3) если есть объекты, которые занимают слишком много памяти
Статический профилировщик может использоваться
(1) только для статически типизированных языков
(2) в языках без указателей
(3) для анализа без учета входных данных
(4) для сбора статистики по запускам
(5) для оценки статичности распределения памяти
Что обозначают цвета в графе несовместимости?
(1) наиболее нагруженные участки кода
(2) наименее совместимые функции программы
(3) распределение регистров
(4) арифметические и логические преобразования данных
Пропускная способность (bandwidth) это
(1) количество элементов данных которые могут быть отправлены процессору из памяти за один цикл
(2) количество операций, которые может выполнить процессор за 1 такт
(3) количество инструкций, которые конвейер может выполнять одновременно
Векторизация это специальный вид распараллеливания программы, при котором
(1) процессор одной командой выполняет несколько обычно однотипных действий параллельно
(2) процессор одной командой выполняет несколько обычно разнотипных действий параллельно
(3) процессор одной командой выполняет несколько обычно однотипных действий по очереди
Что может являться причиной плохого использования ресурсов программой?
(1) конкуренция за ресурсы
(2) "Узкие места" - bottlenecks
(3) большое количество зависимостей по данным
(4) однопоточность
Что из перечисленного относится к синтаксическому анализу в компиляторе
(1) семантический анализ
(2) денотационный анализ
(3) превентивный анализ
(4) сингулярный анализ
(5) грамматический анализ
Граф потока управления
(1) определяет порядок утверждений в исходной программе
(2) определяет все пути которые будут пройдены при вычислении утверждения
(3) определяет как управление может передаваться от одного базового блока к другому
(4) определяет все пути которые могут быть пройдены при выполнении программы
За счет чего может достигаться улучшение производительности при разбиении циклов?
(1) за счет улучшения работы с памятью
(2) за счет уменьшения количества итераций
(3) за счет работы с большим количеством массивов одновременно
Какие из следующих утверждений верны относительно следующего фрагмента программы:
S1 PI = 3.14
S2 R = 5
S3 AREA = PI*R **2
(1)
<S1,S2,S3>
эквивалентно <S1,S3,S2>
(2)
<S1,S2,S3>
эквивалентно <S2,S1,S3>
(3) существует зависимость
<S1,S3>
(4) существует зависимость
<S1,S2>
(5) существует зависимость
<S2,S3>
Что происходит с нулевыми битами в упакованном типе данных?
(1) ничего особенного
(2) незначимые нулевые биты опускаются
(3) сжимаются методом Хаффмана
(4) векторизуются
(5) скаляризуются
Какие свойства есть у вычислительных систем с распределенной памятью?
(1) хорошая масштабируемость
(2) разное время доступа к разным сегментам памяти
(3) хорошее межпроцессорное взаимодействие
(4) необходимость синхронизации подсистемы кэшей
Как происходит взаимодействие параллелизации цикла с другими цикловыми оптимизациями в компиляторе Intel?
(1) при параллелизации невозможны другие цикловые оптимизации
(2) проводится оптимизация цикла, потом применяется параллелизация
(3) проводится параллелизация цикла, потом применяются оптимизации поточной функции
Следующий модификатор не является служебным для OpenMP:
(1)
nowait
(2)
prefork
(3)
schedule
(4)
reduction
Динамический граф вызовов это
(1) граф вызовов, учитывающий переменные типа "указатель"
(2) граф базовых блоков (base block graph)
(3) граф вызовов, построенный при вызове программы
(4) граф вызовов, который динамически определяет операционную систему и использует требуемые системные вызовы
(5) статический граф, вершины которого – темпоральные данные
Что такое подстановка (inlining) ?
(1) подстановка значений переменных
(2) подстановка общих подвыражений
(3) подстановка глобальных вычислений
(4) подстановка тел процедур
Что требуют правила ANTI aliasing?
(1) указатель может быть разыменован к объекту такого же типа
(2) указатель может быть разыменован к объекту произвольного типа
(3) указатель может быть разыменован к объекту примитивного типа
(4) указатель может быть разыменован к объекту совместимого типа
Преимущества динамического профилировщика
(1) не используется статистика
(2) более точная оценка весов переходов
(3) оценка динамичности участков кода
(4) большее количество возможных оптимизаций
За счет чего перестановка полей структуры может ускорить работу приложения?
(1) упрощение циклических конструкций
(2) за счет огрубления результатов
(3) уменьшение промахов по кэшу
(4) уменьшение условных переходов
Конвейер – это
(1) это способ организации вычислений для увеличения числа инструкций, выполняемых в единицу времени
(2) способ определять, какие данные понадобятся для исполнения программы и загрузки их в кэш
(3) это механизм необходимый для предотвращения простоя процессора
КЭШ память различных уровней обычно различается
(1) скоростью доступа
(2) тем, что в первом уровне скаляры, во втором – суперскаляры, а в третьем – векто
(3) размерностью: одномерный, двумерный и трехмерный КЭШ
(4) они равноправны и не различаются
Что такое критический код?
(1) наиболее часто исполняемый участок программы
(2) код, удаление которого не приводит к изменениям
(3) код, который не может достоверно воспроизвести результат
(4) код, правильность которого не доказана
(5) участок программы, который не содержит комментариев разработчика
Каким образом утверждения (statements) связываются в компиляторе Intel
(1) матрицей смежности
(2) таблицей Петрова
(3) графом потока управления
(4) денотационной семантикой
(5) никаким, связывание происходит на другом уровне
Плюсы SSA формы:
(1) программа начинает занимать гораздо меньше места
(2) очевидность def-use цепочек
(3) используются специальные фунции-интриниксы
(4) используются регистры сопроцессора
(5) используются векторные регистры, которые ускоряют вычисления
Из-за чего может происходить потеря производительности при работе с большим циклом?
(1) из-за большого количества арифметических операций
(2) если цикл работает с большим количеством различных массивов, то может происходить вытеснение из кеша необходимых для последующих операций адресов
(3) из-за вытеснения регистров по причине большого количества инвариантов цикла
Что такое нормализованный цикл?
(1) цикл от 0 до некоторого N с шагом 1
(2) цикл от 1 до некоторого N c произвольным шагом
(3) цикл от 1 до некоторого N c шагом 1
Операции с упакованными типами данных это
(1) только операции упаковки и распаковки
(2) операции, которые могут быть удалены из кода
(3) векторные операции
(4) операции, не учитывающие нулевые биты
(5) абстракция, поскольку ассемблер не содержит подобных операций
Какие свойства есть у вычислительных систем с общей памятью?
(1) хорошая масштабируемость
(2) разное время доступа к разным сегментам памяти
(3) хорошее межпроцессорное взаимодействие
(4) необходимость синхронизации подсистемы кэшей
Какими методами можно использовать технику "предвыборки" для оптимизации приложений?
(1) использование директивы компилятора
(2) использование компиляторной опции для автоматической генерации команд "предвыборки"
(3) использование интринсиков
(4) покупка и инсталяция программы поддерки програмной предвыборки
Для того, чтобы после выполнения значение переменной скопировалось в общий поток, необходимо:
(1) добавить переменную в список
private
(2) добавить переменную в список
lastprivate
(3) добавить переменную в список
lastshared
(4) технология не позволяет произвести данное действие
Динамический граф вызовов
(1) не дает никаких преимуществ
(2) не учитывает данные типа
static
(3) использует абстрактные системные вызовы
(4) строится при вызове программы
(5) является всюду плотным
Какие цели преследует постановка (inlining)?
(1) уменьшение накладных расходов
(2) упрощение анализа
(3) облечение именования
(4) упрощение разыменования
(5) более короткие имена
Что такое клонирование функций?
(1) создание компилятором функции-клона, выполняемой на другом устройстве
(2) создание компилятором функции-клона, исполняемой только на встроенной видеокарте
(3) копирование тела функции и использование различных оптимизаций для различных копий
(4) одновременное исполнение функции на кластере или суперкомпьютере
Что требуется для динамической профилировки программы
(1) набрать статистику запусков
(2) временно закомментировать все статические переменные в коде
(3) добавить в начало программы освобождение всей памяти из кучи
(4) выбрать наиболее часто используемые входные данные для программы
(5) проверить код на инлайнинг
Какие цели преследует разбиение структуры данных (structure splitting)?
(1) вынос редкоиспользуемых полей
(2) разбиение на структуры, группированные по разным типам
(3) разбиение на структуры, используемые в разных базовых блоках
(4) разделение полей по признаку длины названия
В полностью ассоциативной кэш-памяти
(1) каждый блок может отображаться в любое место КЭШа
(2) каждый блок может отображаться в одно место
(3) по младшим разрядам определяется строка КЭШа, где может отображаться данная память, выбор из которой проводится на ассоциативной основе
Число циклов процессора, необходимых для передачи единицы данных из памяти — это
(1) время отклика (latency)
(2) тактовая частота процессора
(3) пропускная способность (bandwidth)
Какие условия могут помешать векторизации?
(1) никакие
(2) наличие зависимостей по итерациям
(3) наличие зависимостей по данным
(4) отсутствие зависимостей по данным
(5) отсутствие зависимостей по итерациям
Перестановочная оптимизация трансформирует вычисление в эквивалентное если
(1) оптимизация не добавляет и не удаляет выполняемых утверждений
(2) оптимизация не изменяет графа потока управления
(3) оптимизация не изменяет порядок зависимых утверждений
(4) работает с участками кода не содержащими зависимые утверждения
SSA-форма это:
(1) возможность получения доступа к SSE
(2) форма с однократным присваиванием
(3) специальная форма с инструкциями MMX
(4) формализованное векторное расширение
Необходимым условием существования зависимости по данным между утверждением
S1
и S2
являются следующие условия
(1) оба утверждения обращаются к одной и той же области памяти и модифицируют эту память
(2) оба утверждения обращаются к одной и той же области памяти и по крайней мере одно из них пишет в память
(3) существует возможный путь при исполнении программы от выражения
S1
к выражению S2
(4) не существует пути при исполнении программы от выражения
S1
к выражению S2
Что такое итерационный вектор?
(1) вектор целых чисел, каждое из которых представляет значение итерационной переменной для каждого цикла в порядке вложенности
(2) вектор целых чисел, каждое из которых представляет значение итерационной переменной для каждого цикла в порядке возрастания
(3) вектор целых чисел, каждое из которых представляет значение некоторой переменной после последовательности итераций
Для какой цели необходим интринсик
__alignof__
?
(1) для выравнивания текста
(2) для указания компилятору, как следует выравнивать объекты
(3) для получения информации о выравнивании разных типов
(4) для получения информации о выравнивании разных переменных
Какие свойства есть у вычислительных систем с неоднородным доступом к памяти?
(1) хорошая масштабируемость
(2) разное время доступа к разным сегментам памяти
(3) хорошее межпроцессорное взаимодействие
(4) необходимость синхронизации подсистемы кэшей
В чем заключаются минусы использования техники "предвыборки"?
(1) попытка подгружать адреса в кэш может вызвать удаление из кэша нужных адресов
(2) реализация механизма "предвыборки" сильно ухудшает производительность приложения
(3) невозможность использования этой техники без аппаратной поддержки
Shedule clause
принимает параметром следующие типы:
(1)
static
(2)
dynamic
(3)
variant
(4)
object
(5)
guided
(6)
int
(7)
realtime
(8)
runtime
Какая межпроцедурная оптимизация используется в языке C++
(1) деконструктизация
(2) деобъектизация
(3) девиртуализация
(4) отмена наследования
(5) деполиморфизм
Какие минусы у подстановки (inlining) ?
(1) увеличение кода
(2) усложнение именования для пользователя
(3) увеличение времени работы
(4) повышение накладных расходов на вызов
Что такое частичная подстановка функции?
(1) подстановка части кода на место вызова
(2) подстановка, при которой определяется имя-указатель, которое содержит название подставленной функции
(3) использование оптимизаций базовых блоков без трансформации кода
(4) это динамическая подстановка в процессе исполнения программы
Отличия динамического профилирования от статического
(1) в более грубом предсказании переходов
(2) в наличии статистики
(3) в отсутствии статистики
(4) в том, что учитываются данные типа указатель
(5) в скоростном инлайнинге
С какой целью производится удаление излишних ссылок (pointer chasing)?
(1) лишние ссылки могут привести к неожиданному освобождению памяти
(2) процесс разыменования не всегда детерминирован, его лучше избегать
(3) каждое разыменование требует подгрузку структуры в память, что существенно для больших структур
(4) это нужно для только чтобы избежать лишних операций освобождения памяти
(5) удаление лишних ссылок относится только к стилю оформления программы, а не к скорости и компиляторной оптимизации