Step 2 (S-11545)
Step on Stepik: https://stepik.org/lesson/566/step/2
<img width="50%" src="https://ucarecdn.com/bc485884-15d3-4daf-8b1d-cd584cea9023/">
[00:00 - 00:19] в данном уроке мы поговорим про специализацию шаблона специализации шаблонов это механизм который позволяет указать а суббота для шаблонов шаблоны класса при конкретных значений параметров давайте начнем с обсуждения специализации шаблонов класс а точнее с полной специализации шаблонных классов
[00:19 - 00:35] дело в том чтобы этот счет частичной специализации шаблонов класс по которым будем говорить для примера давайте использовать шаблоны космосимов про которые мы уже не раз говорили в объектах чтобы оно космосима в том числе хранится указатель
[00:35 - 00:54] динамический массив типа то сколько памяти в куче нам потребуется для того чтобы хранить это то что ответить на этот вопрос нам нужно знать сколько байт занимает значение типа то для того чтобы узнать можно воспользоваться оператором сайтов
[00:54 - 01:09] и нам также потребуется знать количество элементов если мы получим количество байт которые необходимо выделить
[01:09 - 01:29] для конкретного типа то конкретного значения size можно вычислить это значит ну например если ты это тип double остались например 1000 то нам потребуется 8000 байт
[01:29 - 01:48] динамическая память давайте решим эту задачу для т равному оказывается что для то равно wall это очень даже более сложно даже в том что стандарты явно не указано сколько байт должны понимать значение типа
[01:48 - 02:05] однако мы точно можем сказать что значении этого был занимает как минимум 1 байт то есть что союзов больше равно единицы
[02:05 - 02:22] вот так как не какой тип не может занимать меньше 1 байта таким образом для хранения 1000 значение типа был нам потребуется как минимум тысяч байт много это или мало
[02:22 - 02:38] давайте поэтому значение типа бог хранит 1 из 2 возможных значениях этого типа истина любовь то есть либо аналог с точки зрения информации которых может храниться в начните был
[02:38 - 02:54] тибул соответствует 1 биту информации то есть либо единичке либо 0 а мы для того чтобы сохранить 1 значение типа был тратим как минимум 1 год то есть как минимум 8 бит если бы мы могли хранить
[02:54 - 03:10] значение типа был таким образом чтобы 1 значению типа был соответствовал ровно 1 бит то мы бы смогли сэкономить понять сколько ни с того что мы могли бы сохранить 1000 поделить на 8
[03:10 - 03:26] то есть 125 мы таким образом получить выигрыш по памяти в 8 раз а точнее как меня 8 раз потому что значение типа bool могу занимать и 2 3 4 байта это не противоречит стандартам а значит мы могли получить выигрыш в 16 или 32 раза
[03:26 - 03:43] но даже выигрыш в 8 раз это уже довольно много каким образом мы можем достичь этого на практике можно не выделять массив был замет тысяч байт а выделить математике для других типов и закодировать значение типа был внутри значений этих тел
<img width="50%" src="https://ucarecdn.com/6dd85ed7-5bad-42ad-a9b7-4b0abd4e212f/">
[03:43 - 04:03] например можно выделить массив целочисленные значения и закодировать значение типа в битум представления этих значительных значит давайте пойдем таким путем и адаптирую шаблон и класс горы для работы с типом этом объеме его полную визуализацию
[04:03 - 04:21] потому что объем определить мы укажем такой шаблон и заголовок с пустым списком шаблонных параметров это будет означать полное с 50 шаблонов и дальше укажем то всего на класс который мы хотели сделать у него есть на специализированном
[04:21 - 04:39] шаблоны класс игры для работы с типом букв это реализация будет работать в том случае если шаблоны класс re в качестве теплоты мы подставим теперь надо разобраться каким образом мы будем кодировать значение типа бол ве
[04:39 - 04:56] значениях целочисленных типов для этого нужно понять в каком значительно типом будем кодировать начните покупать наиболее удобным и простым типом да давайте его использовать и нам нужно понять сколько бит можем закодировать вы думаете
[04:56 - 05:12] для этого давайте заведем следующую статическую константу для меня так количество бит в 1 интервью для того чтобы его посчитать мы множим количество бит
[05:12 - 05:28] в 1 байте и умноженное на количество байт вы думаете на современных компьютерах int обычно занимают 4 байта поэтому нашем примере давайте считать что ты константы равна 32
[05:28 - 05:46] теперь давайте обсудим какие данные будем хранить в объектах этой специализации шаблонов класса мы не будем хранить указатели на немецком институте по пол обоймы указатель на темечке массив типа
[05:46 - 06:02] то есть мы вместо указателей и инициализирован поля после чернобыля в конструкторе приходит количество элементов мы интерпретируем поле сайт количеством элементов и
[06:02 - 06:21] выделяем динамический массив типа int следующего размера мы здесь количество элементов на 20 точно вставь нам приходит 1000 1000 делим на количество бит в 1 нашем случае это 32
[06:21 - 06:38] получается территорию и мы еще прибавляем + 1 + 1 мы добавляем из тех соображений что целочисленное деление оно округляется вниз и таким образом даже в нашем примере например 1000 не поделится нацело на 32 у нас останется 8
[06:38 - 06:57] достатке нам эти 8 дополнительный bullet надо где то хранить но для этого мы добавляем 1 запасной теперь давайте посмотрим как можно реализовать доступ к значениям типа по которым закодировано что неких деталях для этого посмотрим на реализацию
[06:57 - 07:14] константного оператор квадратные скобки важно отметить что это именно константный потому что для реализации неконстантного нам придется некоторым образом испарится а в чем проблема с константным вчера там все просто мы можем
[07:14 - 07:29] в качестве начального значения вернуть значение типа по значению просто дальше а вне константные есть оператора квадратные скобки нам нужно вернуть ссылку на ссылку мы вернуть не можем потому что
[07:29 - 07:44] ссылку можно дышать только на те значения которые где то в памяти хранятся а у нас эти значения явным образом не хранятся мы не можем вернуть ссылку на конкретный вид поэтому у нас есть некоторые проблемы мы хотим вернуть ссылку на пол
[07:44 - 08:02] на самом деле не может эта проблема решается но довольно непростым образом чтобы этих не обсуждай давайте рассмотрим на константный версию оператор квадратные скобки каким образом можно получить значение типа закодированы
[08:02 - 08:20] внутри массива типа ну для начала нужно понять в каком конкретно интим нужно искать соответствующее значение типа давайте посмотрим ну пусть индекс который нам приходят и некоторое число на 24
[08:20 - 08:36] нам пришлось значение типа что мы теперь должны понять в каком интимном искать соответствующий бюстик давайте возьмем стон и поделим на количество бит памяти таким образом мы получим
[08:36 - 08:54] значение 3 это будет номер into внутри которого закодирован этот бук с номером 100 теперь нам нужно понять какой вид этого into соответствует этому значения типа ну если нам для того чтобы
[08:54 - 09:10] этим номером там можно было потерять то не то чтоб найти уже get внутри собственной нужности остаток от деления и на количество бит инде то есть мы вычисляем следующие значения
[09:10 - 09:27] и остаток от деления 100x32 данном случае это будет 4 то есть нам нужен 4 дед из интервью с номером 3 ну то есть 4 года
[09:27 - 09:45] каким образом можно получить этот опыт для этого мы возьмем значение типа 1 значение 1 тип int 1 в представлении это будет много много ноликов
[09:45 - 10:05] вконтакте и теперь мы сдвинем эту единичку при помощи оператора сдвига на 4 позиции таким образом получим следующее мост много много ноликов единичка
[10:05 - 10:20] 4 0 так что водичка стала сам конце найденным на 4 позиции такая маска будет соответствовать 4 бетон в
[10:20 - 10:35] значительное число 4 это москва применить к этому into этом воспользуйтесь оператором набитого и и таким образом если в этом интерес номером 3 на
[10:35 - 10:50] 4 позиции соответствующий бюджет был единичкой то операции логического и выдаст некоторое ненулевое значение это не нулевое значение будет при приведении к типа
[10:50 - 11:06] приведено к значению типа ненулевое значение всегда приводит значениях типа истина если же там ставил нолик то забитого и выдаст 0 и 0 всегда приводят значения типов волос с таким образом
[11:06 - 11:24] мы при помощи такой хитрым образом сделаны мазки научились получать значение и зонтов логичным образом можно научиться кодировать значение типа bool в значение типа то есть устанавливать
[11:24 - 11:40] соответствующий то в этом представлении целых чисел для этого нам потребуется аналогичные маски так если мы хотим закодировать значение истина то есть установить некоторые в состоянии 1 нам потребуется точно такая же маской состоящая из 1 единицы
[11:40 - 11:57] немногих полей и такую маску надо будет применить к соответствующему into при помощи оператора битого или если мы хотим закодировать значение false то есть установить некоторые get в значении 0 вам потребуется обратной маска маска состоящее из 1 0
[11:57 - 12:15] и многих единиц и такую маску надо будет применять при помощи оператора таким образом за счет полный специализации шаблона класс рф мы получили оптимальные по памяти реализацию этого класса и в том случае когда является значением типу
[12:15 - 12:32] надо отметить что данный результат является оптимальной по памяти а по времени доступа мы немножко проиграли насчет того что мы не храним явно значение кодируем и раскодирован на это тратится некоторое время и надо понимать что доступ к элементам
[12:32 - 12:38] таком осел будет немного медленнее чем доступ к честно моего типа