|
|
  |
Снова про const, не получается переползти с С на СРР |
|
|
|
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.
|
|
|
|
|
Jan 21 2011, 07:49
|

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

|
Цитата(Сергей Борщ @ Jan 20 2011, 10:51)  Как можно поместить в ROM адреса объектов, создаваемых на этапе исполнения? Ведь они создаются на стеке/в куче и их адрес заранее неизвестен. Если объекты глобальные, то можно сделать глобальный же массив указателей и его можно разместить в ROM. Да, разместить массив указателей можно в ROM, но использовать этот массив для вызова методов класса похоже нельзя. У меня лично не получается с IAR-ом. Вот простейший код: Код class Tobj { public: Tobj(){} void Draw() {cout << "Hello"; } };
Tobj obj; static const Tobj *p= &obj;
int main() { p->Draw(); return 0; } При компиляции дает ошибку в операторе p->Draw(); Код Error[Pe315]: the object has cv-qualifiers that are not compatible with the member function C:\AP\CPP\main.cpp object type is: Tobj const __data Что это значит, я затрудняюсь ответить. Если же в означенном коде убрать static const при указателе на обьект, то все прекрасно живет, но указатель оказывается в RAM!
|
|
|
|
|
Jan 21 2011, 08:10
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(Aprox @ Jan 21 2011, 10:49)  Что это значит, я затрудняюсь ответить.
Если же в означенном коде убрать static const при указателе на обьект, то все прекрасно живет, но указатель оказывается в RAM! Вот так надо: Код static Tobj const *p= &obj; Прочитайте про квалификатор const у страуструпа или еще где. Он многогранен в зависимости от местоположения. Указатель будет константным (то есть адрес на который он будет указывать известен на этапе компиляции), а вот объект obj может меняться. Кстати можно и так: Код class Tobj { public: Tobj(){} void Draw() const {cout << "Hello"; } };
Tobj obj; static Tobj const *p= &obj;
int main() { p->Draw(); return 0; }
|
|
|
|
|
Jan 21 2011, 11:00
|

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

|
Цитата(jorikdima @ Jan 21 2011, 11:10)  Вот так надо: Код static Tobj const *p= &obj; Прочитайте про квалификатор const у страуструпа или еще где. Он многогранен в зависимости от местоположения. Указатель будет константным (то есть адрес на который он будет указывать известен на этапе компиляции), а вот объект obj может меняться. Кстати можно и так: Код class Tobj { public: Tobj(){} void Draw() const {cout << "Hello"; } };
Tobj obj; static Tobj const *p= &obj;
int main() { p->Draw(); return 0; } Попробовал ваш вариант. К сожалению, компилятор IAR хоть ошибок и не выдает, но упорно размещает константный указатель р в сегменте данных, т.е. в RAM кристалла. Проверял на симуляторе Embedded Workbench IAR ver.430A
|
|
|
|
|
Jan 21 2011, 13:59
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Aprox @ Jan 21 2011, 13:00)  К сожалению, компилятор IAR хоть ошибок и не выдает, но упорно размещает константный указатель р в сегменте данных, т.е. в RAM кристалла. Что-то я не нашёл тут константного указателя. Код const object_type *ptr; object_type const *ptr; суть изменяемые указатели на константные объекты. И там, и там *ptr имеет тип object_type с квалификатором const. А сам ptr квалификаторов не имеет. Код object_type * const ptr = &some_non_constant_object; Константный указатель на изменяемый объект. Значение можно задать только при инициализации, потом указатель изменить нельзя. Код const object_type * const ptr = &some_constant_object; Константный указатель на константный объект.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 21 2011, 14:18
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(ReAl @ Jan 21 2011, 16:59)  Что-то я не нашёл тут константного указателя. Код const object_type *ptr; object_type const *ptr; суть изменяемые указатели на константные объекты. И там, и там *ptr имеет тип object_type с квалификатором const. А сам ptr квалификаторов не имеет. Код object_type * const ptr = &some_non_constant_object; Константный указатель на изменяемый объект. Значение можно задать только при инициализации, потом указатель изменить нельзя. Код const object_type * const ptr = &some_constant_object; Константный указатель на константный объект. Бл***, вы правы, звездочку не справа от const, а слева надо ставить, чтоб константный указатель был. Сорри, описАлся
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|