Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (type) vs reinterpret_cast<type>, явное приведение в Си и Си++ 
V
    Опции темы
djamshud
Дата 16.9.2010, 19:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Ремарка Капитана. Да, в рамках синтаксиса и семантики языка это весьма годная конструкция, но джамшут с borisbn не стандарт языка грызут, а рассуждают о дизайне приложения и его частей, а так же о культуре программирования в общем. С этой точки зрения попытка записи в const-область - весьма нестандартный поступок. Капитан в курсе, что const_cast случается и из-за кривости рук разработчика АПИ.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 16.9.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(djamshud @  16.9.2010,  18:01 Найти цитируемый пост)
попытка записи в const-область - весьма нестандартный поступок

специально для Капитана:

1. const- объект далеко не всегда реально константный, всего лишь логически.
2. const_cast бывает нужный не только для убирания константности, но и для ее добавления 
smile


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 16.9.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(djamshud @  16.9.2010,  16:47 Найти цитируемый пост)
Имхо, обычные касты документировать не нужно, т.к. это не хаки. Действительно хак - избавляться от константности. А преоразование типа - это нормальная практика. 

reinterpret - это ненормальная практика. Но иногда необходимая (обычно из-за "сишности" или непродуманности используемых библиотек, но не в этом суть).

Цитата(mes @  16.9.2010,  19:30 Найти цитируемый пост)
2. const_cast бывает нужный не только для убирания константности, но и для ее добавления 

Ээ.. А можно пример, где это действительно нужно и не произойдёт автоматом? При передачи в функцию, возврате из функции или присваиванию переменной - всегда само отработает (ну это и логично).


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 16.9.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  16.9.2010,  18:40 Найти цитируемый пост)
. А можно пример, где это действительно нужно и не произойдёт автоматом? 

там где надо вызвать именно константную версию метода, а имеем не константный объект..



Это сообщение отредактировал(а) mes - 16.9.2010, 19:56


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 16.9.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



mes

1. Капитан считает это очевидным:). Он писал не о константной области памяти, а о сферическом нечто, что попадает к нам в руки и представляется константным. В это нечто, по хорошему, писать - ни-ни!
2. Хороший пример. Но тоже весьма нестандартный, значит следует это отметить в коде.

Это сообщение отредактировал(а) djamshud - 16.9.2010, 20:45


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 16.9.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(djamshud @  16.9.2010,  19:43 Найти цитируемый пост)
 Он писал не о константной области памяти, а о сферическом нечто, что попадает к нам в руки и представляется константным.

бывает так, что требуется что то изменить объекту, не меняя при этом логической константности.. 
пример тот же внутренний  кэш..  


Это сообщение отредактировал(а) mes - 16.9.2010, 20:58


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 16.9.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



mes, конечно. Это не хак, а гениальный трюк:). И парой камментов раньше я это писал. Но мсье прикопался к "хаку", вот я и раскрывал хаковую часть природы const_cast


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Abyx
Дата 16.9.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



const - это как правило запрет на запись времени компиляции, не более того.

Это нормально, если внутри библиотеки объект mutable,
а во внешнем интерфейсе библиотеки он const, чтоб пользовательский код его не трогал.
Код

class SomeLibraryInterface
{
public:
    const Obj* get_obj() { return get_obj_impl(); }
    void change_obj(const Obj* obj) { change_obj_impl(const_cast<Obj*>(obj)); }
private:
    Obj* get_obj_impl();
    void change_obj_impl(Obj* obj);
}

PM MAIL   Вверх
Любитель
Дата 16.9.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(mes @  16.9.2010,  19:56 Найти цитируемый пост)
там где надо вызвать именно константную версию метода, а имеем не константный объект..

Да, согласен. Хотя логически это всё равно очень странно. Обычно константная и неконстантная версия одного метода делают одно и тоже. Иначе это слишком неочевидно, как я считаю (с точки зрения конечного пользователя).

Добавлено через 1 минуту и 49 секунд
Цитата(Abyx @  16.9.2010,  22:55 Найти цитируемый пост)
const - это как правило запрет на запись времени компиляции, не более того.

Ну что-то мне подсказывает, что для локальных переменных "простых типов" const будет означать либо их непосредственную подстановку, либо (если это массив или структура) запись данных в "неменяемую" область памяти. Хотя, очевидно, это компиляторозависимо и т. д.


--------------------
PM MAIL ICQ Skype   Вверх
djamshud
Дата 16.9.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Во время конпеляции конст вообще не играет никакой роли. Именно потому кстати, что в рантайме от нее можно избавиться. Никакие механизмы оптимизации не рассматривают конст как показатель. Константность - плюшка для программиста, и все.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 16.9.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  16.9.2010,  22:04 Найти цитируемый пост)
Обычно константная и неконстантная версия одного метода делают одно и тоже. Иначе это слишком неочевидно, как я считаю (с точки зрения конечного пользователя).

чтоб далеко не ходить : оператор [] при CopyOnWrite

Добавлено через 6 минут и 40 секунд
Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
Во время конпеляции конст вообще не играет никакой роли.

прям уж никакой ?  smile 

Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
Именно потому кстати, что в рантайме от нее можно избавиться.

а как ?.. а в компил-тайм нельзя избавиться ?

Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
 Константность - плюшка для программиста, и все. 

а знаете почему вектор ругается , когда в него auto_ptr запихивают ?
а как работает вышеупомянутое CopyOnWrite ?
и многое другое что с разбегу в голову не приходит.. 
 smile 


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 16.9.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Я прекрасно знаю, как работает КоВ. По собственному опыту. И благодаря плюшки для программиста в виде константности она реализовывается. Впрочем без нее тоже можно сделать без проблем, но накладных расходов чуть больше.

>прям уж никакой ?

Помимо собственно семантического анализа (что консту можно, а что - нет) и того, что компилятор может размещать статические объекты в константной области памяти, никакой.

>а как ?.. а в компил-тайм нельзя избавиться ?

Кастованием. В компил-тайм компилятор не знает, к каким именно объектам будут применяться неконстантные методы в рантайме. То есть предполагается, что с объектом в рантайме может твориться все, что угодно. Поэтому он никогда не доверяет констам во время проведения оптимизации, самостоятельно вычисляя в какие моменты (участки выполнения) те или иные объекты стопроцентно не будут изменены.

>а знаете почему вектор ругается , когда в него auto_ptr запихивают ?
>а как работает вышеупомянутое CopyOnWrite ?
>и многое другое что с разбегу в голову не приходит.. 

Это все и есть плюшка.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 16.9.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  16.9.2010,  23:18 Найти цитируемый пост)
auto_ptr

стыд позор. это же уг. при том древний.

Добавлено через 43 секунды
зы
как отписаться от темы? достали уже уведомления smile 
PM WWW   Вверх
djamshud
Дата 16.9.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



boostcoder, фи, отписаться... А как же поучаствовать в сраче?:)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 16.9.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(djamshud @  16.9.2010,  23:53 Найти цитируемый пост)
в сраче

правильное слово для происходящего smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.