|
Снова про const, не получается переползти с С на СРР |
|
|
|
Jan 10 2011, 06:05
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Искал свою проблему в форуме, но не нашел решения. Проблема в следующем. Имеется готовый проект на С для IAR-430A, кристаллы ARM ST91х. Использую структуры, состоящие из данных-констант вида: Код typedef struct{ const Tsome_type some_data1; const Tsome_type some_data2; // ...etc } Tsome_info; Затем в коде на С создаю эти структуры с уже конкретными константами в полях Код const Tsome_info info1={,,,,,}; const Tsome_info info2={,,,,,}; const Tsome_info info3={,,,,,}; //..etc На С все прекрасно живет, компилятор помещает мои структуры в сегмент CONST, а линкер- в ROM. Но, тот же самый код на СPP приводит к размещению структур в сегменте CSTACK вместе с другими объектами. В результате куча констант хранится в RAM, которой и так мало! Я в шоке.  Можно ли как-то победить эту проблему? Или придется перелопачивать идеологию проекта?
|
|
|
|
|
 |
Ответов
|
Jan 11 2011, 18:52
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Aprox @ Jan 12 2011, 00:04)  как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично? Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора. Если объектов немного, то можно шаблонами. Типа Код struct ComboProps1 { enum { width = 200 }; enum { height = 500 }; enum { some_bool_prop1 = false }; ... };
struct ComboProps2 { enum { width = 300 }; enum { height = 200 }; enum { some_bool_prop1 = true }; ... };
template<typename Props> class TComboBox { enum { width = Props::width }; ... }
TComboBox<ComboProps1> Combo1; TComboBox<ComboProps2> Combo2;
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 13 2011, 06:05
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(AHTOXA @ Jan 12 2011, 00:52)  Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора. Ваш вариант задания констант-описаний выглядит читабельно и красиво. Однако, если в структуре-описания много разных типов, например, строки, указатели на места памяти, float и пр., то ваш вариант приводит к излишней писанине в момент декларации самих констант. Мне кажется, следующий вариант экономней в смысле писанины Код typedef struct{ int i; float f; char* s; } Tprops;
//----здесь декларации свойств с экономией писанины static const Tprops prop1 ={13, 3.14, "Name1"}; // это точно попадает в ROM static const Tprops prop2 ={16, 2.73, "Name2"}; // это точно попадает в ROM
class Tobj {//------------- const Tprops* p; public: Tobj(){} Tobj(const Tprops* prop) {p=prop;} // здесь можно пользоваться элементами описания *p.f или p->i };
Tobj example1=&prop1; Tobj example2=&prop2;
...
|
|
|
|
|
Jan 13 2011, 06:29
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Aprox @ Jan 13 2011, 14:05)  Мне кажется, следующий вариант экономней в смысле писанины Дык, моя фраза Цитата(AHTOXA @ Jan 12 2011, 02:52)  константные структуры, и указатель на них в качестве параметра конструктора. была как раз про этот вариант  А с шаблонами - это альтернативный.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 13 2011, 08:23
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(AHTOXA @ Jan 13 2011, 12:29)  А с шаблонами - это альтернативный. Я про шаблоны и говорю, что писанины больше при инициализации полей структуры-описания. В каждом конкретном определении структуры свойств придется набирать имена полей и все сопутствующее. Кроме того, шаблоны не поддерживает Embedded C++, а переходить на Extended C++ сразу утяжеляет проект ненужными фичами. Я тут подумал, можно несколько повысить быстродействие, если передавать конструктору класса не указатель на структуру-описание, а ссылку на эту структуру. Заодно и в методах классах обращение к описаниям будет выглядеть приятнее.
|
|
|
|
|
Jan 13 2011, 15:40
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Aprox @ Jan 13 2011, 16:23)  Я про шаблоны и говорю, что писанины больше при инициализации полей структуры-описания. В каждом конкретном определении структуры свойств придется набирать имена полей и все сопутствующее. Это понятно. Плюс к тому, вы получаете фактически по классу на каждый экземпляр объекта. Поэтому я и написал, "если объектов немного". Но есть у шаблонов и плюсы. Например, все ветки if () и case, зависящие от константных параметров шаблона, компилятор вычислит на этапе компиляции (то есть их не останется). То есть, код Код if (some_bool_prop1) func1(); else func2(); при some_bool_prop1 == true будет скомпилирован в Код func1(); Цитата(Сергей Борщ @ Jan 13 2011, 16:36)  За счет чего будет подъем быстродействия? Как вы представляете внутренюю реализацию ссылки кроме как через указатель? Может, для ссылки на константу есть надежда, что компилятор подставит константу прямо в код?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 19 2011, 18:50
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(AHTOXA @ Jan 14 2011, 11:39)  А как иначе?  Ну или можно скомпилировать оба варианта и сравнить размеры получившихся программ. Попробовал. Дисассемблером не лазил, а размеры программ сравнил. Практически неотличимо. Как передавать создаваемому объекту структуру из констант разобрался. Прошу дальнейшей помощи идейного плана. Сейчас уперся в другое. Задача стоит прорисовывать в окне разнородные объекты, например. TComboBox, TCheckBox. TRadioButton..etc., каждый имеет свое описание в виде структур констант, тоже разнотипных. Я думал создать базовый класс TObj с виртуальной функцией прорисовки и от него уже наследовать разнотипные классы, каждый со своей конкретной прорисовкой. Далее думал создать массив указателей на базовые объекты прорисовки и в цикле, по очереди вызывать функцию прорисовки базового объекта. Тупик наступил на этапе- где должен размещаться указатель на структуру описание, в базовом, или наследуемом классе? По идее в наследуемом. Но тогда до нее не доберешься из базового класса, а ведь цикл прорисовки идет именно по списку из указателей на базовые. Если структуру-констант разместить в базовом классе, то теряется вся идея, поскольку структуры все разного типа и указать конкретно один тип, базовый, не представляется возможным. Прошу совета у гуру С++ - как быть? Также прошу иметь в виду, что речь идет об ARM кристаллах, в которых RAM - маловато, а ROM- много больше. Т.е. по-прежнему загвоздка с директивой const.
|
|
|
|
Сообщений в этой теме
Aprox Снова про const Jan 10 2011, 06:05 Сергей Борщ QUOTE (Aprox @ Jan 10 2011, 11:05) На С в... Jan 10 2011, 06:41 sergeeff Ну и оставьте свои
Кодconst Tsome_info info1={,,,... Jan 10 2011, 06:46 Aprox Спасибо за идею! Действительно, проект можно с... Jan 10 2011, 07:55  Сергей Борщ QUOTE (Aprox @ Jan 10 2011, 12:55) Чисто ... Jan 10 2011, 08:58 sergeeff В общем случае надо явно компилятору/линкеру сообщ... Jan 10 2011, 08:05 Aprox Цитата(sergeeff @ Jan 10 2011, 14:05) В о... Jan 10 2011, 16:44  Сергей Борщ QUOTE (Aprox @ Jan 10 2011, 21:44) Вот мо... Jan 10 2011, 20:11   Aprox Спасибо огромное! Действительно, попробовал по... Jan 11 2011, 00:36    Сергей Борщ QUOTE (Aprox @ Jan 11 2011, 05:36) Действ... Jan 11 2011, 03:36     Aprox Цитата(Сергей Борщ @ Jan 11 2011, 09:36) ... Jan 11 2011, 05:55 dimka76 А если IAR посвежее взять может там что-то изменил... Jan 10 2011, 08:24 sergeeff Вы должны четко понять, что С и С++ это разные ком... Jan 10 2011, 16:58    sergeeff Цитата(Aprox @ Jan 11 2011, 23:04) А все-... Jan 11 2011, 17:23        Сергей Борщ QUOTE (Aprox @ Jan 13 2011, 13:23) Я тут ... Jan 13 2011, 08:36             Aprox И еще вдогонку вопрос. Как я понимаю, тот массив с... Jan 20 2011, 06:46              Сергей Борщ QUOTE (Aprox @ Jan 20 2011, 08:46) Потому... Jan 20 2011, 07:51               Aprox Цитата(Сергей Борщ @ Jan 20 2011, 10:51) ... Jan 21 2011, 07:49                jorikdima Цитата(Aprox @ Jan 21 2011, 10:49) Что эт... Jan 21 2011, 08:10                 Aprox Цитата(jorikdima @ Jan 21 2011, 11:10) Во... Jan 21 2011, 11:00                  Сергей Борщ QUOTE (Aprox @ Jan 21 2011, 13:00) но упо... Jan 21 2011, 11:09                   Aprox Цитата(Сергей Борщ @ Jan 21 2011, 14:09) ... Jan 21 2011, 12:39                  ReAl Цитата(Aprox @ Jan 21 2011, 13:00) К сожа... Jan 21 2011, 13:59                   jorikdima Цитата(ReAl @ Jan 21 2011, 16:59) Что-то ... Jan 21 2011, 14:18                   Aprox Цитата(ReAl @ Jan 21 2011, 16:59) Кодobje... Jan 21 2011, 15:12    Oldring Цитата(Aprox @ Jan 11 2011, 22:04) А все-... Jan 11 2011, 20:40   dxp Цитата(Oldring @ Jan 11 2011, 18:25) В го... Jan 12 2011, 05:12    Oldring Цитата(dxp @ Jan 12 2011, 11:12) Такие да... Jan 12 2011, 05:29    jorikdima Цитата(dxp @ Jan 12 2011, 11:12) Такие да... Jan 12 2011, 09:34     dxp Цитата(jorikdima @ Jan 12 2011, 18:34) co... Jan 13 2011, 02:47 ReAl const_cast<> цяця-ляля, но до тех пор, пока ... Jan 12 2011, 17:23 Oldring Цитата(ReAl @ Jan 12 2011, 23:23) А когда... Jan 13 2011, 06:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|