|
Общие данные экземпляров класса, C++ |
|
|
|
Apr 15 2014, 08:43
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Подскажите такой момент. Есть класс, при инициализации он создает 3 блока данных, из которых только один блок уникальный для этого экземпляра, остальные - совершенно одинаковые для каждого экземпляра, не модифицируются. Так как занимают они приличный объем, есть сильное желание от них избавиться, точнее - выделить за пределы класса Пока на ум приходит только некий глобальный флаг, который выставлять после инициализации самого первого экземпляра, но, скорее всего, есть более элегантное решение, просто я о нем не знаю
|
|
|
|
|
Apr 15 2014, 10:14
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(Сергей Борщ @ Apr 15 2014, 13:50)  Вынести их в отдельные классы, формировать в конструкторах, а уже объекты этих классов сделать статическими членами. и так тоже думал, но я забыл указать еще одну вводную - уникальный блок экземпляра как раз используется сначала для формирования sBox, потом создается sBoxInv, потом - expandedKey в том самом уникальном блоке экземпляра И вот как это скрестить - не совсем понимаю Если бы был один ключ - оставил бы все на чистом C, но есть необходимость в нескольких. Сделал. Работает, но вот захотелось залить все в одну бочку. Может, конечно, сделать как в том анекдоте - "... вот иди, сынок, и ничего там не трогай", - но вот решил организовать класс и теперь уже самому интересно, как это можно реализовать Сейчас посмотрел реализацию более внимательно. Скорее всего, можно будет использовать второй общий блок вместо уникального блока экземпляра, сейчас попробую Если срастется, то да, Ваш вариант вполне подойдет UPD Нет, как раз в формировании sBox используются все три блока, потом один уже не нужен, он-то и является уникальным для экземпляра и используется потом для expandedKey
|
|
|
|
|
Apr 15 2014, 10:45
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(XVR @ Apr 15 2014, 14:29)  Пока видно, что все данные уникальные. Где тут 'общие данные'? Откуда видно-то?  еще раз - в "общих" блоках формируются sBox и sBoxInv (они - общие, фактически - константы, но в RAM), но для их формирования (сейчас, в реализации на C) используется уникальный блок, в котором, после формирования sBox и sBoxInv, формируется expandedKey
|
|
|
|
|
Apr 15 2014, 11:21
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(XVR @ Apr 15 2014, 14:59)  Ясно. А что мешает посчитать эти sBox и sBoxInv вне программы вообще, и вставить в виде константного массива байтов?
Если же вам надо именно в run-time их заполнить, то это можно сделать при создании первого экземпляра вашего объекта. sBox и sBoxInv сделать статическими, но заполнять в конструкторе, если они еще не заполнены еще раз - места во флеш нет, точнее, в секторе, который отведен под bootloader сейчас так и сделано на чистом C - есть флаг, который проверяется я же и спрашиваю - можно ли это сделать более красиво на ++?
|
|
|
|
|
Apr 15 2014, 13:21
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата я же и спрашиваю - можно ли это сделать более красиво на ++? В принципе можно, но тогда компилятор сам сделает эту самую статическую переменную в 'стиле С' (и еще одну придется попросту выбросить) Код 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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|