Как создать ссылку на объект C ++ из указателя стиля C абсолютного адреса - PullRequest
0 голосов
/ 03 февраля 2020

Нам нужно сделать много операций с 8/16/32 битными (без знака) целыми числами, хранящимися в дополненной форме. Для этого у нас есть шаблон целочисленного класса с операторами, и из этого мы получаем несколько классов с подписанным и беззнаковым содержимым 8/16/32.

I: E: uint32_at, uint32_bt, int32_at int32_bt и др. c. где каждый экземпляр класса имеет внутреннюю переменную val со значением.

Мы хотим иметь постоянные массивы такого объекта, но если мы определим:

const uint32_bt table[4096] = { uint32_bt(5), uint32_bt(17), ... };

, компилятор генерирует конструктор призыв к каждому элементу. Эффективный компилятор сгенерирует 4 x 4096 = 16 384 байта fla sh. Наш компилятор генерирует около 100 КБ fla sh и 16384 байта SRAM, так как он вызывает конструктор для создания каждого элемента.

Одна идея состоит в том, чтобы сгенерировать таблицу в C, а затем создать класс C ++ для полной таблицы.

const uint32_t CTable[4096] = { ... };

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

CPP_Table Table(4096, CTable);
   This initiates two internal variables
   tab = CTable
   size = 4096

Затем оператор индекса вернет объект, который является просто ссылка на что-то в таблице C.

uint32B operator [] (
const uint32B& operator [] (const uint32_t index) const
{
    return (somekindofcast)(&tab[size - index]);
}

Итак, вопрос в том, как преобразовать адрес, чтобы я мог вернуть ссылку на объект?

1 Ответ

1 голос
/ 03 февраля 2020
const uint32_bt table[4096] = { uint32_at(5), uint32_at(17), ... };

компилятор генерирует вызов конструктора для каждого элемента.

Марка uint32_at конструктор constexpr. И сделать его массивом uint32_at.

...