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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Снова про const, не получается переползти с С на СРР
AHTOXA
сообщение Jan 13 2011, 15:40
Сообщение #31


фанат дивана
******

Группа: Свой
Сообщений: 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) *
За счет чего будет подъем быстродействия? Как вы представляете внутренюю реализацию ссылки кроме как через указатель?

Может, для ссылки на константу есть надежда, что компилятор подставит константу прямо в код?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 14 2011, 07:52
Сообщение #32


Местный
***

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



Цитата(AHTOXA @ Jan 13 2011, 21:40) *
Может, для ссылки на константу есть надежда, что компилятор подставит константу прямо в код?
Подскажите, какие существуют методы для проверки подобных гипотез? Дисассемблер?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 14 2011, 08:39
Сообщение #33


фанат дивана
******

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



А как иначе? sm.gif
Ну или можно скомпилировать оба варианта и сравнить размеры получившихся программ.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 19 2011, 18:50
Сообщение #34


Местный
***

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



Цитата(AHTOXA @ Jan 14 2011, 11:39) *
А как иначе? sm.gif
Ну или можно скомпилировать оба варианта и сравнить размеры получившихся программ.
Попробовал. Дисассемблером не лазил, а размеры программ сравнил. Практически неотличимо.

Как передавать создаваемому объекту структуру из констант разобрался. Прошу дальнейшей помощи идейного плана. Сейчас уперся в другое. Задача стоит прорисовывать в окне разнородные объекты, например. TComboBox, TCheckBox. TRadioButton..etc., каждый имеет свое описание в виде структур констант, тоже разнотипных. Я думал создать базовый класс TObj с виртуальной функцией прорисовки и от него уже наследовать разнотипные классы, каждый со своей конкретной прорисовкой. Далее думал создать массив указателей на базовые объекты прорисовки и в цикле, по очереди вызывать функцию прорисовки базового объекта.
Тупик наступил на этапе- где должен размещаться указатель на структуру описание, в базовом, или наследуемом классе? По идее в наследуемом. Но тогда до нее не доберешься из базового класса, а ведь цикл прорисовки идет именно по списку из указателей на базовые. Если структуру-констант разместить в базовом классе, то теряется вся идея, поскольку структуры все разного типа и указать конкретно один тип, базовый, не представляется возможным. Прошу совета у гуру С++ - как быть? Также прошу иметь в виду, что речь идет об ARM кристаллах, в которых RAM - маловато, а ROM- много больше. Т.е. по-прежнему загвоздка с директивой const.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 19 2011, 19:44
Сообщение #35


фанат дивана
******

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



Цитата(Aprox @ Jan 19 2011, 23:50) *
По идее в наследуемом. Но тогда до нее не доберешься из базового класса, а ведь цикл прорисовки идет именно по списку из указателей на базовые.

До неё и не надо добираться. Доступ к ней будет из функции Draw() наследуемого класса. А к функции Draw() доступ по указателю на базовый класс есть, так что всё в порядке.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 19 2011, 20:37
Сообщение #36


Местный
***

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



Цитата(AHTOXA @ Jan 19 2011, 22:44) *
До неё и не надо добираться. Доступ к ней будет из функции Draw() наследуемого класса. А к функции Draw() доступ по указателю на базовый класс есть, так что всё в порядке.
Спасибо, все получилось. rolleyes.gif
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 20 2011, 06:46
Сообщение #37


Местный
***

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



И еще вдогонку вопрос. Как я понимаю, тот массив с указателями на обьекты окажется в RAM? Потому, что обьекты создаются на этапе исполнения программы, а не во время компиляции? У меня таких массивов довольно много, на С удавалось их поместить в ROM директивой const. А можно ли то же самое выполнить в С++ ? Чтобы списки обьектов помещались в ROM?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 20 2011, 07:51
Сообщение #38


Гуру
******

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



QUOTE (Aprox @ Jan 20 2011, 08:46) *
Потому, что обьекты создаются на этапе исполнения программы, а не во время компиляции? У меня таких массивов довольно много, на С удавалось их поместить в ROM директивой const.
Как можно поместить в ROM адреса объектов, создаваемых на этапе исполнения? Ведь они создаются на стеке/в куче и их адрес заранее неизвестен. Если объекты глобальные, то можно сделать глобальный же массив указателей и его можно разместить в ROM.


--------------------
На любой вопрос даю любой ответ
"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
Aprox
сообщение Jan 21 2011, 07:49
Сообщение #39


Местный
***

Группа: Участник
Сообщений: 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!
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 21 2011, 08:10
Сообщение #40


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 21 2011, 11:00
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2011, 11:09
Сообщение #42


Гуру
******

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



QUOTE (Aprox @ Jan 21 2011, 13:00) *
но упорно размещает константный указатель р в сегменте данных
Как называется сегмент, в который помещается указатель? Если DATA_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
Aprox
сообщение Jan 21 2011, 12:39
Сообщение #43


Местный
***

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



Цитата(Сергей Борщ @ Jan 21 2011, 14:09) *
Как называется сегмент, в который помещается указатель? Если DATA_C, то смотрите линкерный скрипт - перенесите этот сегмент из ОЗУ в ПЗУ.
Посмотрел. К сожалению, константный указатель попадает в сегмент DATA_I, т.е. в зону инициализируемых при стартапе переменных.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 21 2011, 13:59
Сообщение #44


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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;
Константный указатель на константный объект.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 21 2011, 14:18
Сообщение #45


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 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, а слева надо ставить, чтоб константный указатель был. Сорри, описАлся sad.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 05:46
Рейтинг@Mail.ru


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