реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Общие данные экземпляров класса, C++
toweroff
сообщение Apr 15 2014, 08:43
Сообщение #1


Гуру
******

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



Подскажите такой момент.
Есть класс, при инициализации он создает 3 блока данных, из которых только один блок уникальный для этого экземпляра, остальные - совершенно одинаковые для каждого экземпляра, не модифицируются. Так как занимают они приличный объем, есть сильное желание от них избавиться, точнее - выделить за пределы класса
Пока на ум приходит только некий глобальный флаг, который выставлять после инициализации самого первого экземпляра, но, скорее всего, есть более элегантное решение, просто я о нем не знаю sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2014, 08:58
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Напрашивается сделать их статическими членами. И пронициализировать в месте определения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 09:10
Сообщение #3


Гуру
******

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



Цитата(Сергей Борщ @ Apr 15 2014, 12:58) *
Напрашивается сделать их статическими членами. И пронициализировать в месте определения.

да, тоже так думал, но их инициализация - не тривиальное "присвоение". Это формирование sBox и sBoxInv для AES. Использовать Flash для хранения этих констант не получается - места мало
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2014, 09:50
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 10:14
Сообщение #5


Гуру
******

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



Цитата(Сергей Борщ @ Apr 15 2014, 13:50) *
Вынести их в отдельные классы, формировать в конструкторах, а уже объекты этих классов сделать статическими членами.

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

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

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

UPD
Нет, как раз в формировании sBox используются все три блока, потом один уже не нужен, он-то и является уникальным для экземпляра и используется потом для expandedKey
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 15 2014, 10:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
и так тоже думал, но я забыл указать еще одну вводную - уникальный блок экземпляра как раз используется сначала для формирования sBox, потом создается sBoxInv, потом - expandedKey в том самом уникальном блоке экземпляра
Пока видно, что все данные уникальные. Где тут 'общие данные'?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 10:45
Сообщение #7


Гуру
******

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



Цитата(XVR @ Apr 15 2014, 14:29) *
Пока видно, что все данные уникальные. Где тут 'общие данные'?

Откуда видно-то? sm.gif
еще раз - в "общих" блоках формируются sBox и sBoxInv (они - общие, фактически - константы, но в RAM), но для их формирования (сейчас, в реализации на C) используется уникальный блок, в котором, после формирования sBox и sBoxInv, формируется expandedKey
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2014, 10:47
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Apr 15 2014, 13:45) *
но для их формирования (сейчас, в реализации на C) используется уникальный блок,
В смысле - используется как временный промежуточный буфер?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 10:49
Сообщение #9


Гуру
******

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



Цитата(Сергей Борщ @ Apr 15 2014, 14:47) *
В смысле - используется как временный промежуточный буфер?

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

UPD
я могу, конечно, использовать этот временный блок как некий буфер обмена по разным интерфейсам в дальнейшем, но это не кошерно же sm.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 15 2014, 10:59
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

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

Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 11:21
Сообщение #11


Гуру
******

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



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

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

еще раз - места во флеш нет, точнее, в секторе, который отведен под bootloader
сейчас так и сделано на чистом C - есть флаг, который проверяется
я же и спрашиваю - можно ли это сделать более красиво на ++?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2014, 12:01
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 15 2014, 12:06
Сообщение #13


Гуру
******

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



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

Сергей, куча вообще не используется
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2014, 12:29
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Apr 15 2014, 15:06) *
куча вообще не используется
placement new() - это не куча


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 15 2014, 13:21
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016