Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Общие данные экземпляров класса
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Подскажите такой момент.
Есть класс, при инициализации он создает 3 блока данных, из которых только один блок уникальный для этого экземпляра, остальные - совершенно одинаковые для каждого экземпляра, не модифицируются. Так как занимают они приличный объем, есть сильное желание от них избавиться, точнее - выделить за пределы класса
Пока на ум приходит только некий глобальный флаг, который выставлять после инициализации самого первого экземпляра, но, скорее всего, есть более элегантное решение, просто я о нем не знаю sm.gif
Сергей Борщ
Напрашивается сделать их статическими членами. И пронициализировать в месте определения.
toweroff
Цитата(Сергей Борщ @ Apr 15 2014, 12:58) *
Напрашивается сделать их статическими членами. И пронициализировать в месте определения.

да, тоже так думал, но их инициализация - не тривиальное "присвоение". Это формирование sBox и sBoxInv для AES. Использовать Flash для хранения этих констант не получается - места мало
Сергей Борщ
Цитата(toweroff @ Apr 15 2014, 12:10) *
Это формирование sBox и sBoxInv для AES. Использовать Flash для хранения этих констант не получается - места мало
Вынести их в отдельные классы, формировать в конструкторах, а уже объекты этих классов сделать статическими членами.
toweroff
Цитата(Сергей Борщ @ Apr 15 2014, 13:50) *
Вынести их в отдельные классы, формировать в конструкторах, а уже объекты этих классов сделать статическими членами.

и так тоже думал, но я забыл указать еще одну вводную - уникальный блок экземпляра как раз используется сначала для формирования sBox, потом создается sBoxInv, потом - expandedKey в том самом уникальном блоке экземпляра

И вот как это скрестить - не совсем понимаю
Если бы был один ключ - оставил бы все на чистом C, но есть необходимость в нескольких. Сделал. Работает, но вот захотелось залить все в одну бочку. Может, конечно, сделать как в том анекдоте - "... вот иди, сынок, и ничего там не трогай", - но вот решил организовать класс и теперь уже самому интересно, как это можно реализовать

Сейчас посмотрел реализацию более внимательно. Скорее всего, можно будет использовать второй общий блок вместо уникального блока экземпляра, сейчас попробую
Если срастется, то да, Ваш вариант вполне подойдет

UPD
Нет, как раз в формировании sBox используются все три блока, потом один уже не нужен, он-то и является уникальным для экземпляра и используется потом для expandedKey
XVR
Цитата
и так тоже думал, но я забыл указать еще одну вводную - уникальный блок экземпляра как раз используется сначала для формирования sBox, потом создается sBoxInv, потом - expandedKey в том самом уникальном блоке экземпляра
Пока видно, что все данные уникальные. Где тут 'общие данные'?
toweroff
Цитата(XVR @ Apr 15 2014, 14:29) *
Пока видно, что все данные уникальные. Где тут 'общие данные'?

Откуда видно-то? sm.gif
еще раз - в "общих" блоках формируются sBox и sBoxInv (они - общие, фактически - константы, но в RAM), но для их формирования (сейчас, в реализации на C) используется уникальный блок, в котором, после формирования sBox и sBoxInv, формируется expandedKey
Сергей Борщ
Цитата(toweroff @ Apr 15 2014, 13:45) *
но для их формирования (сейчас, в реализации на C) используется уникальный блок,
В смысле - используется как временный промежуточный буфер?
toweroff
Цитата(Сергей Борщ @ Apr 15 2014, 14:47) *
В смысле - используется как временный промежуточный буфер?

конечно, и не хотелось бы для этого выделять статический массив. Куча также не используется, поэтому, для расчета таблиц, выделить и бросить этот кусок расточительно

UPD
я могу, конечно, использовать этот временный блок как некий буфер обмена по разным интерфейсам в дальнейшем, но это не кошерно же sm.gif
XVR
Цитата(toweroff @ Apr 15 2014, 14:45) *
еще раз - в "общих" блоках формируются sBox и sBoxInv (они - общие, фактически - константы, но в RAM),
Ясно. А что мешает посчитать эти sBox и sBoxInv вне программы вообще, и вставить в виде константного массива байтов?

Если же вам надо именно в run-time их заполнить, то это можно сделать при создании первого экземпляра вашего объекта. sBox и sBoxInv сделать статическими, но заполнять в конструкторе, если они еще не заполнены

toweroff
Цитата(XVR @ Apr 15 2014, 14:59) *
Ясно. А что мешает посчитать эти sBox и sBoxInv вне программы вообще, и вставить в виде константного массива байтов?

Если же вам надо именно в run-time их заполнить, то это можно сделать при создании первого экземпляра вашего объекта. sBox и sBoxInv сделать статическими, но заполнять в конструкторе, если они еще не заполнены

еще раз - места во флеш нет, точнее, в секторе, который отведен под bootloader
сейчас так и сделано на чистом C - есть флаг, который проверяется
я же и спрашиваю - можно ли это сделать более красиво на ++?
Сергей Борщ
Цитата(toweroff @ Apr 15 2014, 13:49) *
конечно, и не хотелось бы для этого выделять статический массив. Куча также не используется, поэтому, для расчета таблиц, выделить и бросить этот кусок расточительно
Что мешает этот блок объявить как автоматическую переменную в конструкторах sBox и sBoxInv? Он будет выделен на стеке и после выполнения конструкторов освобожден. На крайний случай разместить его при помощи placement new() в том месте, где потом будет жить "буфер обмена по разным интерфейсам в дальнейшем"
toweroff
Цитата(Сергей Борщ @ Apr 15 2014, 16:01) *
Что мешает этот блок объявить как автоматическую переменную в конструкторах sBox и sBoxInv? Он будет выделен на стеке и после выполнения конструкторов освобожден. На крайний случай разместить его при помощи placement new() в том месте, где потом будет жить "буфер обмена по разным интерфейсам в дальнейшем"

Сергей, куча вообще не используется
Сергей Борщ
Цитата(toweroff @ Apr 15 2014, 15:06) *
куча вообще не используется
placement new() - это не куча
XVR
Цитата
я же и спрашиваю - можно ли это сделать более красиво на ++?
В принципе можно, но тогда компилятор сам сделает эту самую статическую переменную в 'стиле С' (и еще одну придется попросту выбросить)

Код
class YourClass {
static StaticData d1;
LocalBuffer b1;

bool once_init()
  {
    ... init d1 using b1 as temporary space ...
  }
public:
YourClass()
   {
     static bool once_init_flag=once_init(); // 'once_init()' Will be called only once on first constructor call
     ....
   }
};

Если жалко места на once_init_flag - заверните once_init() в класс (сделайте что надо в его конструкторе), и установите статический экземпляр его в конструкторе YourClass
toweroff
XVR, спасибо, проясняется картина.
Здесь тогда возникает вопрос о использовании памяти - шило на мыло, тот же флаг все равно?
Да и с кодом тоже не факт
Короче говоря, нужно попробовать, отпишусь
XVR
Цитата
Здесь тогда возникает вопрос о использовании памяти - шило на мыло, тот же флаг все равно?
Сама булевская переменная не используется вообще. А флаг заведет сам компилятор, что бы определить факт первого прохода через инстанс этой самой неиспользуемой статической переменной, что бы ее проинициализировать. Но флаг конечно есть, куда же без него wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.