Задать вопрос
bullitufa
@bullitufa
электронщик программист (микроконтроллеры и PC)

Можно ли и создать экземпляр класса (с++) с проинициализированными полями?

Добрый день!

Есть класс, который по сути является Сишной структурой, т.е. поля без методов. Так как разработка ведётся под микроконтроллер, где "640 кбайт ОЗУ может и не хватить" и поля класса не будут меняться в процессе, хотелось бы "затолкать" такие переменные во Flash.
Естественно запись
class type_class {
int field1;
int field2;
  type_class (int f1, int f2) {
    field1 = f1;
    field2 = f2;
  }
}
const type_class var(12, 34);

не создаёт переменную во Flash. Можно ли в C++ это как нибудь обойти?
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
$ cat > test.cpp <<EOF
class type_class {
        int field1;
        int field2;
public:
        constexpr type_class (int f1, int f2): field1(f1), field2(f2) {
        }
};
extern const type_class var;
const type_class var(12, 34);
EOF
$ g++ -S -O2 test.cpp
$ cat test.s
        .file   "test.cpp"
        .globl  var
        .section        .rodata
        .align 8
        .type   var, @object
        .size   var, 8
var:
        .long   12
        .long   34
        .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
        .section        .note.GNU-stack,"",@progbits

Т.е. constexpr конструктор, в результате -- готовый инициализированный объект в секции .rodata, что и требовалось.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
> поля класса не будут меняться в процессе
значит, их нужно делать статическими константами и, возможно, вообще убрать класс, заменив на namespace.

> "Говорят" можно через шаблон, но как не сказали)
По сути, те же статические константы, только могут быть только целым числом и не имеют адреса.
template< int X, int Y >
class NAME
{
public:
    enum { field1 = X, field2 = Y };
};

typedef NAME<5,7> Name57;

int a = Name57::field1;
int b = Name57::field2;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы