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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Снова про const, не получается переползти с С на СРР
Oldring
сообщение Jan 11 2011, 09:25
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(dxp @ Jan 11 2011, 14:53) *
Это как это? А что же тогда он гарантирует? И почему "в плюсах"? А в голом Цэ по-иному строится отношение к константным объектам?


В голых сях - иначе. Было у Страуструпа эссе по этому поводу.
Слово гарантирует, что программист не модифицирует объект неумышленно. Но всё равно если есть конструктор-деструктор, они будут вызваны. И иногда константные объекты мутируют. Было даже введено в язык специальное ключевое слово "mutable". Но иногда обходятся по-старинке и без него, снимая константность с указателя.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 11 2011, 16:04
Сообщение #17


Местный
***

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



А все-таки, посоветуйте новичку в "плюсах", как наиболее грамотно и экономно в смысле RAM строить объекты, которые используют предопределенные свойства в виде набора констант. Можно на хрестоматийном примере компонента ComboBox. Там используется куча свойств-констант. Отсюда вопрос- как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 11 2011, 17:23
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Aprox @ Jan 11 2011, 23:04) *
А все-таки, посоветуйте новичку в "плюсах", как наиболее грамотно и экономно в смысле RAM строить объекты, которые используют предопределенные свойства в виде набора констант. Можно на хрестоматийном примере компонента ComboBox. Там используется куча свойств-констант. Отсюда вопрос- как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично?


Куда же вас понесло с "христоматийным" TComboBox в embedded на LPC?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 11 2011, 18:52
Сообщение #19


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

Группа: Свой
Сообщений: 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;


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


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Aprox @ Jan 11 2011, 22:04) *
А все-таки, посоветуйте новичку в "плюсах", как наиболее грамотно и экономно в смысле RAM строить объекты, которые используют предопределенные свойства в виде набора констант. Можно на хрестоматийном примере компонента ComboBox. Там используется куча свойств-констант. Отсюда вопрос- как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично?



Объект не может одновременно находиться в ROM и в RAM. Поэтому, если у объекта есть изменяемые поля - он может находиться только в RAM. При этом декларативные свойства объекта могут быть описаны в виде структуры-агрегата, которая может располагаться в ROM. Объект при этом должен содержать указатель на эту константную структуру с этими неизменяемыми параметрами.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 12 2011, 05:12
Сообщение #21


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Oldring @ Jan 11 2011, 18:25) *
В голых сях - иначе. Было у Страуструпа эссе по этому поводу.
Слово гарантирует, что программист не модифицирует объект неумышленно. Но всё равно если есть конструктор-деструктор, они будут вызваны.

Ни конструктор, ни деструктор не изменяют константных членов-данных. Только создают или удаляют. То, что это не очень вяжется с концепциями реализации ПЗУ - так ПЗУ и константы - это разные вещи. В конструкторе допускается инициализация константных полей, но только в списке инициализации, в теле конструктора уже нет. И работает это только для целых (почему такое ограничение, не знаю). Т.ч. ничего там не меняется.

Цитата(Oldring @ Jan 11 2011, 18:25) *
И иногда константные объекты мутируют. Было даже введено в язык специальное ключевое слово "mutable". Но иногда обходятся по-старинке и без него, снимая константность с указателя.

mutable - это из другой песни. Это нужно, чтобы можно было отдельные поля модифицировать в фукнциях-членах, объявленных как const. Заметьте, что речь идет не о константных членах-данных. Такие данные изменить не получится в любом случае.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jan 12 2011, 05:29
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(dxp @ Jan 12 2011, 11:12) *
Такие данные изменить не получится в любом случае.


После явного снятия константности - легко.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 12 2011, 09:34
Сообщение #23


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

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



Цитата(dxp @ Jan 12 2011, 11:12) *
Такие данные изменить не получится в любом случае.

const_cast<>() ?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 12 2011, 17:23
Сообщение #24


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

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



const_cast<> цяця-ляля, но до тех пор, пока мы снимаем то, что оделось по дроге - метка (*1) ниже.
А когда оно изначально было const -- метка (*2) -- имеем в полный рост UB, что как раз в embedded с флешами всякими и вылезет.
На PC шара прокатывает. Пока не начали секции с константами селить в страницы "только для чтения" с исключениями "генерал Фаульта" при попытке записи.

C++2003 7.1.5.1 The cv-qualifiers
...
4 Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
5 [Example:
Код
const int ci = 3; // cv-qualified (initialized as required)
ci = 4;               // ill-formed: attempt to modify const
int i = 2;            // not cv-qualified
const int* cip;   // pointer to const int
cip = &i;            // OK: cv-qualified access path to unqualified
*cip = 4;            // ill-formed: attempt to modify through ptr to const
int* ip;               // cast needed to convert const int* to int*
ip = const_cast<int*>(cip); // defined: *ip points to i, a non-const object     (*1)
*ip = 4;
const int* ciq = new const int (3); // initialized as required
int* iq = const_cast<int*>(ciq);    // cast required
*iq = 4;                            // undefined: modifies a const object      (*2)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 13 2011, 02:47
Сообщение #25


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(jorikdima @ Jan 12 2011, 18:34) *
const_cast<>() ?

После const_cast<> компилятор "умывает руки" и никакой защиты и проверок со его стороны стороны нет. Речь шла о безопасных преобразованиях (для чего умышленно вводят const в объявления) по правилам языка - так вот они не допускают модификации константных объектов.

Цитата(Oldring @ Jan 12 2011, 14:29) *
После явного снятия константности - легко.

Ага. А еще метод:

const int a = 10;

int addr = (int)&a;

int *p = (int*)addr;

(*p)++;

И еще много таких финтов можно придумать. Только речь о конструкциях языка, а не о хаках


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 13 2011, 06:05
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 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;

...

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2011, 06:29
Сообщение #27


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

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



Цитата(Aprox @ Jan 13 2011, 14:05) *
Мне кажется, следующий вариант экономней в смысле писанины

Дык, моя фраза
Цитата(AHTOXA @ Jan 12 2011, 02:52) *
константные структуры, и указатель на них в качестве параметра конструктора.

была как раз про этот вариант sm.gif А с шаблонами - это альтернативный.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jan 13 2011, 06:54
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(ReAl @ Jan 12 2011, 23:23) *
А когда оно изначально было const -- метка (*2) -- имеем в полный рост UB, что как раз в embedded с флешами всякими и вылезет.


Вы же не считаете, что запихивание констант во флеш - это defined bihavior?
Всё, что обсуждается в этой теме, и есть UB.

Цитата(Aprox @ Jan 13 2011, 12:05) *
[code]typedef struct{
int i;
float f;
char* s;
} Tprops;
[code]


Тут typedef в плюсах не нужен.

Цитата(dxp @ Jan 13 2011, 08:47) *
Только речь о конструкциях языка, а не о хаках


И у вас "конструкции языка".


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Aprox
сообщение Jan 13 2011, 08:23
Сообщение #29


Местный
***

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



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

Я тут подумал, можно несколько повысить быстродействие, если передавать конструктору класса не указатель на структуру-описание, а ссылку на эту структуру. Заодно и в методах классах обращение к описаниям будет выглядеть приятнее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 13 2011, 08:36
Сообщение #30


Гуру
******

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



QUOTE (Aprox @ Jan 13 2011, 13:23) *
Я тут подумал, можно несколько повысить быстродействие, если передавать конструктору класса не указатель на структуру-описание, а ссылку на эту структуру.
За счет чего будет подъем быстродействия? Как вы представляете внутренюю реализацию ссылки кроме как через указатель?


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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