игра брюс 2048
Главная / Программирование / Программирование на С/С++ / Тест 35

Программирование на С/С++ - тест 35

Упражнение 1:
Номер 1
Какие утверждения о размещения элементов многомерного массива в памяти верны?

Ответ:

 (1) двухмерный массив T a[N][M] содержит N последовательно расположенных в памяти строк по M элементов 

 (2) двухмерный массив T a[N][M] содержит N произвольно расположенных в памяти строк по M элементов 

 (3) соглашения о размерности - это условности, с многомерным массивом можно работать как с одномерным 

 (4) многомерный массив может быть вектором векторов 


Номер 2
Как правила выравнивания типов действуют при выделении памяти под массивы, многомерные массивы?

Ответ:

 (1) правила выравнивания типов при выделении памяти под массив действуют на каждую строку массива 

 (2) правила выравнивания типов при выделении памяти под массив действуют на 0-й элемент массива 

 (3) правила выравнивания типов при выделении памяти под массив действуют на каждый элемент массива 

 (4) правилами выравнивания строк массива можно управлять посредством атрибута aligned 


Номер 3
Какие утверждения относительно инициализации многомерных массивов верны?

Ответ:

 (1) для инициализации многомерных массивов может быть использован синтаксис инициализации одномерного массива 

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

 (3) возможна инициализация двухмерного массива по столбцам 

 (4) возможна неполная инициализации строк, при этом оставшиеся элементы строки инициализируются нулями 

 (5) если массив инициализирован построчно, но в некоторых строках не инициализирован ни одни элемент, то значения элементов таких строки неопределённо 


Упражнение 2:
Номер 1
Каким образом можно оптимизировать работу с памятью в high-load приложениях?

Ответ:

 (1) оптимизировать обход многомерных массивов 

 (2) стараться размещать обрабатываемые совместно данные в соседних или близких ячейках памяти 

 (3) при инициализации массивов заполнять их нулями 

 (4) использовать векторные инструкции процессора 

 (5) переписать код на ассемблере 


Номер 2
Какой оптимальный вариант перебора данных для многомерного массива?

Ответ:

 (1) упорядоченный перебор, не важно по столбцам или по строкам ускоряет быстродействие операции 

 (2) перебор строк двухмерного массива по столбцу выполняется эффективнее чем перебор столбцов по строке 

 (3) перебор столбцов по строке выполняется эффективнее чем перебор строк двухмерного массива по столбцу 

 (4) случайный доступ к элементам массива не отличается по эффективности от любого типа упорядоченного перебора 

 (5)


Номер 3
Как и почему расположение в памяти объектов данных влияет на производительность?

Ответ:

 (1) если данные, с которыми работают соседние инструкции кода умещаются в кэше процессора, то не требуется, затратное по процессорному времени, считывание данных из оперативной памяти 

 (2) по схемотехническим причинам считывание соседних ячеек памяти в строке выполняется гораздо быстрее чем соседних ячеек в столбце 

 (3) случайный доступ к ячейкам памяти выполняется быстрее, так как не создаёт нагрузки на строку или столбец оперативной памяти 

 (4) считывание ячеек памяти, расположенных в одном столбце, то есть с интервалом в длину строки оперативной памяти, выполняется наиболее быстро 


Упражнение 3:
Номер 1
В чём преимущества вектора векторов перед многомерным массивом?

Ответ:

 (1) гарантирует смежное расположение всех элементов массива в памяти 

 (2) позволяет иметь разное количество элементов в каждой строке 

 (3) при большом размере массива снижает риск того, что в системе не найдётся подходящего куска памяти 

 (4) создавать и удалять вектор векторов проще чем массив 

 (5) уменьшает вероятность фрагментации памяти 


Номер 2
В чём преимущества многомерного массива перед вектором векторов?

Ответ:

 (1) гарантирует смежное расположение всех элементов массива в памяти 

 (2) позволяет иметь разное количество элементов в каждой строке 

 (3) создавать и удалять массив проще чем вектор векторов 

 (4) уменьшает вероятность фрагментации памяти 


Номер 3
Какие из приведённых ниже операторов присвоения для элементов массива double m[8][4] являются правильными?

Ответ:

 (1) m[2][3] = 3; 

 (2) *(m[2] + 3) = 121; 

 (3) m[2] = 14; 

 (4) **m = 35; 

 (5) *(*(m+2) + 3) = 11; 


Упражнение 4:
Номер 1
Указателю на какой тип можно присвоить указатель на тип Т?

Ответ:

 (1) указателю на void 

 (2) указателю на тип, совместимый с T 

 (3) указателю на тип, тождественный Т 

 (4) указателю только на тип Т 


Номер 2
Каковы основные правила при присвоении одного указателя другому?

Ответ:

 (1) базовые типы должны быть тождественны 

 (2) достаточно того что бы базовые типы были совместимы 

 (3) константный указатель можно присвоить только константному указателю 

 (4) указатель на константный объект можно присвоить только указателю на константный объект 

 (5) указателю на void можно присвоить любой как константный, так и не константный указатель 


Номер 3
Какие присвоения для const int ct; const unsigned int* pt; long const* cpt; допустимы?

Ответ:

 (1) const int const* p1 = &ct 

 (2) int *p3 = &ct; 

 (3) int const* p12 = pt; 

 (4) int * p13 = pt; 

 (5) const int const* p21 = cpt; 


Упражнение 5:
Номер 1
Где и для чего используется ключевое слово restrict?

Ответ:

 (1) при объявлении указателей на объекты данных, для которых гарантируется что к ним нет никакого другого способа доступа кроме этих указателей 

 (2) при объявлении статических массивов объектов встроенных типов для оптимизации их размещения в памяти 

 (3) при передаче в функцию по указателю объектов данных, для которых гарантируется что к ним нет никакого другого способа доступа кроме этих указателей 

 (4) при объявлении указателей на объекты данных, которые желательно разместить в регистрах процессора 


Номер 2
Каковы условия контракта, который заключается с компилятором использованием ключевого слова restrict при объявлении указателя?

Ответ:

 (1) указатель является единственным способом доступа к области памяти в блоке кода 

 (2) компилятор будет использовать оптимистичную стратегию оптимизации при работе с памятью, на которую указывает этот указатель 

 (3) компилятор гарантирует что не допустит доступа ко этому объекту памяти через другой указатель 

 (4) компилятор попытается по возможности разместить указатель в регистре процессора 


Номер 3
Почему в объявлении POSIX функции memmove() и memcmp() для параметров не используется ключевое слово restrict, а для memcpy используется?

Ответ:

 (1) для функций memmove() и memcmp() нельзя гарантировать что передаваемые в функцию через указатели участки памяти не имеют пересечения 

 (2) для функций memmove() и memcmp() внутри функции возможна модификация всех передаваемых областей памяти 

 (3) не на всех платформах функции memmove() и memcmp() могут быть оптимизированы 

 (4) указатели в функциях memmove() и memcmp() не могут быть константными 


Упражнение 6:
Номер 1
Каким образом может быть объявлена функция, принимающая строку двухмерного или многомерного массива в качестве параметра?

Ответ:

 (1) int foo(double a[][M], long N); 

 (2) int foo(long rows, long cols, double a[rows][cols]); 

 (3) int foo(double (*b)[M][M2][M3], long sz1) 

 (4) int foo(long , long , double a[*][*]); 

 (5) int foo(double (**b), long sz1) 


Номер 2
Какие особенности динамических массивов указаны верно?

Ответ:

 (1) размер динамического массивы может быть изменён во время его жизни 

 (2) размер динамического массивы определяется в момент начала исполнения блока кода, где этот массив объявлен 

 (3) использование массива переменной длины как формального параметра функции означает передачу данных по указателю 

 (4) инициализировать массив переменной длины при его объявлении возможно, как константами, так и переменными 


Номер 3
В чём ограничены массивы переменной длины?

Ответ:

 (1) нельзя объявить глобальный массив переменной длины 

 (2) нельзя объявить массив переменной длины в прототипе функции 

 (3) нельзя заранее инициализировать динамический массив 

 (4) нельзя разместить массив переменной длины в области статической памяти 

 (5) нельзя использовать автоматические переменные для задания размерности массива  


Упражнение 7:
Номер 1
Каковы особенности выравнивания структур?

Ответ:

 (1) структуры выравниваются в соответствии с наибольшей характеристикой среди элементов структуры 

 (2) объекты составных типов выравниваются в соответствии с характеристикой наибольшего элемента среди элементов структуры 

 (3) принудительное выравнивание статически размещаемых структур выполняется при помощи атрибута aligned 

 (4) принудительное выравнивание динамически размещаемых структур выполняется при выделении памяти функцией posix_memalig() 


Номер 2
Какие утверждения относящиеся к упаковке структуры в памяти верны?

Ответ:

 (1) при выравнивании элементов структуры в памяти возникают пропуски памяти 

 (2) пропуски в памяти, возникающие при размещении структуры в памяти являются непроизводительной затратой памяти 

 (3) пропуски в памяти, возникающие при размещении структуры в памяти приводят к задержкам при записи данных структуры в память 

 (4) пропуски в памяти, возникающие при размещении структуры в памяти могут привести к увеличению занимаемых структурой линий кэша процессора 


Номер 3
Что влияет на наличие лакун в памяти при описании структуры?

Ответ:

 (1) архитектура процессора 

 (2) оптимизирующие действия компилятора 

 (3) порядок следования элементов структуры 

 (4) общий размер структуры 


Упражнение 8:
Номер 1
Какие возможности даёт использование утилиты pahole?

Ответ:

 (1) получить информацию о физическом размещении структур в памяти 

 (2) получить информацию о потерях быстродействия при доступе к памяти 

 (3) сколько линий кэш-памяти первого уровня займёт структура 

 (4) сколько строк и столбцов оперативной памяти займёт структура 

 (5) получить варианты реорганизации структуры 


Номер 2
Какие утверждения насчёт оптимизации быстродействия работы с структурами верны?

Ответ:

 (1) компоновка в отдельные структуры только данных, которые используется совместно, повышает быстродействие доступа к памяти с этими данными 

 (2) замена нескольких компактных структур на одну большую повышает быстродействие работы с памятью 

 (3) пересмотр всех используемых типов на возможность уменьшения размеров полей структуры может привести к повышению быстродействия 

 (4) оптимизация быстродействия путём реорганизации структур повышает читаемость и сопровождаемость кода 

 (5) порядок следования полей в структурах влияет на быстродействие доступа к полям структуры 


Номер 3
Каким образом порядок полей в структуре влияет на производительность памяти при работе с структурой (и массивом структур)?

Ответ:

 (1) порядок элементов в структуре может минимизировать размер структуры, и уменьшить количество занятых структурой линий кэш-памяти процессора 

 (2) размещение длинных массивов в начале структуры ускоряет считывание данных из памяти 

 (3) обход элементов структуры в том же порядке что они обходятся процессором ускоряет доступ к этим элементам 

 (4) размещение наиболее востребованных элементов в начале структуры ускоряет доступ к этим элементам 


Упражнение 9:
Номер 1
Какие утверждения насчёт "пузырей" в конвейере инструкций ЦП верны?

Ответ:

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

 (2) "пузыри" в конвейере инструкций ЦП ведут к тому, что процессору приходится выполнять больше инструкций в единицу времени 

 (3) неоптимальная организация ассиметричных условных операторов ведёт к загрузке в кэш команд процессора инструкций, которые не будут выполняться 

 (4) неоптимальная организация ассиметричных условных операторов ведёт к загрузке в кэш данных процессора данных, которые не будут использоваться 

 (5) загрузка в кэш команд процессора инструкций, которые не будут выполняться, может быть полностью предотвращена использованием функции __builtin_expect() 


Номер 2
Каким образом может решаться проблема неоптимальных ветвлений кода?

Ответ:

 (1) профилирование с целью узнать: какие условные ветвления кода выполняются чаще 

 (2) реорганизация кода таким образом, что бы в условном операторе стояло условие, которое выполняется чаще чем не выполняется 

 (3) использование функции __builtin_expect() 

 (4) использование GCC-атрибутов always_inline и noinline 


Номер 3
Какие утверждения о функции __builtin_expect() верны?

Ответ:

 (1) это функция POSIX 

 (2) функция решает на основании собранной статистики, какое ветвление кода необходимо загружать в кэш-память команд 

 (3) это функция информирует компилятор, какое условие будет выполнено с наибольшей вероятностью 

 (4) используется когда проблематично реорганизовывать код оптимальным образом из-за ухудшения читаемости и сопровждаемости 

 (5) функция ухудшает читаемость и сопровождаемость кода 


Упражнение 10:
Номер 1
Какие плюсы и минусы даёт встраивание функций?

Ответ:

 (1) компилятор работает с линейным кодом, который весь загружен в кэш команд процессора 

 (2) исключаются операции, связанные с формированием кадра стека и вызовом функции 

 (3) полученный при встраивании большой блок кода компилятору сложнее оптимизировать 

 (4) если функции вызываются многократно из разных мест, то встраивание уменьшает объем объектного файла 

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


Номер 2
Каким способом можно пытаться принудить функцию к встраиванию в компиляторе GCC?

Ответ:

 (1) достаточно объявить функцию как inline 

 (2) достаточно использовать атрибут (always_inline) компилятора 

 (3) необходимо одновременно объявить функцию как inline и использовать атрибут (always_inline) компилятора 

 (4) необходимо одновременно объявить функцию как inline и использовать атрибут (noinline) компилятора 


Номер 3
Какую информацию можно получить с помощью утилиты pfunct?

Ответ:

 (1) получить информацию о потерях быстродействия при доступе к памяти 

 (2) сколько функций из запрошенных на встраивание не удалось встроить 

 (3) размер функций 

 (4) сколько линий кэш-памяти первого уровня займёт каждая функция 

 (5) количество безусловных переходов на метку 


Упражнение 11:
Номер 1
Переменные в каких областях памяти инициализируются до входа программы в функцию main()?

Ответ:

 (1) область данных 

 (2) сегмент BBS 

 (3) куча 

 (4) программный стек  


Номер 2

                /*---- start of main.c ----*/
				#include <stdio.h>
				
				const char* g_name = "programm";
				char directory[8];
				
				int main(int argc, char* argv[] )
				{
					int i = 1;
					const char* right_name = "right";
					for (; i 
                ]]>В какой части памяти программы из выше приведённого файла main.c находится переменная right_name?

Ответ:

 (1) область данных 

 (2) сегмент BBS  

 (3) куча  

 (4) программный стек  


Номер 3

                /*---- start of main.c ----*/
				#include <stdio.h>
				
				const char* g_name = "programm";
				char directory[8];
				
				int main(int argc, char* argv[] )
				{
					int i = 1;
					const char* right_name = "right";
					for (; i<argc; ++i)
					{
						if (0 == strcmp(argv[i], right_name))
							return 0;
					}
					return 1;
				}
				/*---- end of main.c ----*/
                
]]>В какой части памяти программы из вышеприведённого файла main.c находится переменная argc?
Ответ:

 (1) область данных 

 (2) сегмент BBS  

 (3) куча  

 (4) программный стек  


Упражнение 12:
Номер 1
Какие операции выполняет функция malloc?

Ответ:

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

 (2) выделяет фрагмент оперативной памяти заданного размера и фрагмент памяти для служебной информации 

 (3) выделяет непрерывный фрагмент оперативной памяти, превышающий заданный размер на размер служебной информации 

 (4) обнуляет выделенный фрагмент памяти 

 (5) записывает служебную информацию начало выделенного фрагмента памяти 


Номер 2
Какие утверждения относительно функции free() верны?

Ответ:

 (1) функция free() обнуляет переданный по указателю фрагмент памяти, беря размер из служебной информации фрагмента 

 (2) функция free() помечает ранее выделенный фрагмент как свободный 

 (3) вызов функции free() c нулевым указателем ведёт повреждению логической карты памяти и краху программы 

 (4) функция free() использует полученный указатель для доступа к расположенному в начале фрагмента блоку служебной информации, размещённому ранее функцией malloc() 


Номер 3
Что описывает стандарт POSIX?

Ответ:

 (1) работу с threads 

 (2) взаимодействие POSIX совместимой OS с устройствами ввода-вывода 

 (3) работу с сигналами 

 (4) информацию о всех POSIX совместимых функциях 

 (5) правила работы POSIX совместимой OS с стеком протоколов TCP/IP 




Главная / Программирование / Программирование на С/С++ / Тест 35