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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> небольшая задачка 
V
    Опции темы
korian
Дата 18.3.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Из книги "Стандарты программирования на C++" Герб Саттер, Андрей Александреску
Цитата

...
Кроме того, реальность такова, что результат применения reinterpret_cast еще хуже, чем просто насильственная интерпретация битов объекта (что само по себе достаточно нехорошо). За исключением некоторых гарантированно обратимых преобразований результат работы reinterpret_cast зависит от реализации, так что вы даже не знаете точно, как именно он будет работать. Это очень ненадежное и непереносимое преобразование.
Исключение.
<пропущено>... Если вам требуется преобразование между указателями несвязанных типов, лучше выполнять его через приведение к void* вместо непосредственного использования reinterpret_cast, т.е. вместо кода
T1* p1 = ...;
T2* p2 = reinterpret_cast<T2*> (p1);
лучше писать
T1* p1 = ...;
void* pV = p1;
T2* p2 = static_cast<T2*> (pV);
...


Цитата(Alek86 @  18.3.2008,  13:21 Найти цитируемый пост)
то есть реализация бустовского addressof некроссплатформенна?

не знаю, может те преобразования входят в число "некоторых гарантированно обратимых преобразований".
в этой книги они не описаны, надо читать стандарт.
PM   Вверх
korian
Дата 18.3.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Alek86 @  18.3.2008,  12:10 Найти цитируемый пост)
разве можно статиккастить так?

Код

class C {
public:
 C* operator&() {return 0;}
 C* operator&() const {return 0;}
};

int main()
{
   C obj;
   C* p = static_cast<C*>(static_cast<C&>(obj));
   return 0;
}

http://www.comeaucomputing.com/  такой код не компилит
а Borland C++ Builder хавает  smile 
PM   Вверх
MAKCim
Дата 18.3.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(korian @  18.3.2008,  12:52 Найти цитируемый пост)
размер указателя на A и размер указателя на C могут отличаться, так что есть вероятность потерять часть данных 

вы о чем, сударь?  smile 
мне адрес надо получить, что я и делаю
это раз
во-вторых, размер указателя фиксирован разрядностью процессора
и не важно какого он типа

Добавлено @ 22:10
Цитата(korian @  18.3.2008,  13:54 Найти цитируемый пост)
на борланде 6.0 работает

это неправильно
если предположить, что такой каст прокатывает, то я удивляюсь, что результат является адресом (а он точно им является?)  smile 
семантически результат в таком случае должен быть равен значению объекта c, приведенного к указателю
а значение объекта недетерминировано, т. к класс не определяет ни одного поля
в таком случае размер объекта c обычно 1 и соответствующий байт должен быть беззнаково дополнен до 32-х (64-х) разрядов

Добавлено @ 22:17
Цитата(Alek86 @  18.3.2008,  13:43 Найти цитируемый пост)
думаю, это и есть решение... 

зачем такой изврат?
Код

&reinterpret_cast<const int&>(c);


Это сообщение отредактировал(а) MAKCim - 18.3.2008, 22:17


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(MAKCim @  18.3.2008,  21:06 Найти цитируемый пост)

во-вторых, размер указателя фиксирован разрядностью процессора
и не важно какого он типа

ключевая фраза - работать на любых платформах.
а у вас уже привязка к конкретному процессору. C++ не оговаривает, что все указатели имеют один размер.

Цитата(MAKCim @  18.3.2008,  21:06 Найти цитируемый пост)
Цитата(korian @  18.3.2008,  13:54 )
на борланде 6.0 работает

это неправильно

полностью согласен.


Это сообщение отредактировал(а) korian - 18.3.2008, 23:35
PM   Вверх
MAKCim
Дата 19.3.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(korian @  18.3.2008,  23:33 Найти цитируемый пост)
ключевая фраза - работать на любых платформах.
а у вас уже привязка к конкретному процессору. C++ не оговаривает, что все указатели имеют один размер.

указатель (aka адрес) имеет один и тот же размер в рамках одной платформы
его размер не зависит от типа
адрес - это понятие, вообще не связанное с С++


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 19.3.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



MAKCim, можно ссылку на стандарт, если есть?

Добавлено через 1 минуту и 25 секунд
Цитата(MAKCim @  18.3.2008,  22:06 Найти цитируемый пост)
зачем такой изврат?

честно говоря не знаю, но, думаю, если бы он (такой изврат) не был нужен, то в бусте его бы и не было


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 19.3.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  19.3.2008,  10:35 Найти цитируемый пост)
MAKCim, можно ссылку на стандарт, если есть?

это очевидно
ты сам подумай
указатель определяет адрес
от изменения типа переменной, адрес которой содержит указатель, размер адреса измениться не может
это по определению

Добавлено через 1 минуту и 12 секунд
Цитата(Alek86 @  19.3.2008,  10:35 Найти цитируемый пост)
честно говоря не знаю, но, думаю, если бы он (такой изврат) не был нужен, то в бусте его бы и не было 

"не видел, но осуждаю"  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 19.3.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Допустим есть некая платформа, в которой есть 2 вида указателей - на мелкие объекты и на большие обьеты (< 1'000'000 бит). Размеры у них (указателей) разные, так как памяти максимум 100'000'000 бит. потому указатели на мелкие объекты должны иметь одно из 100 млн значений, а указатели на большие обьекты - всего лишь 1 из сотни (из-за выравнивания). Потому указатели на мелкие обьекты состоят из 20 бит, а на большие - из 7 бит.
И из-за того. что
Цитата(MAKCim @  19.3.2008,  11:08 Найти цитируемый пост)
это очевидно


на C++ на такой платформе работать нельзя? По-моему такие "мелочи" должны быть оговорены в стандарте.


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 19.3.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



Цитата(Alek86 @  19.3.2008,  12:24 Найти цитируемый пост)
Допустим есть некая платформа, в которой есть 2 вида указателей - на мелкие объекты и на большие обьеты (< 1'000'000 бит). Размеры у них (указателей) разные, так как памяти максимум 100'000'000 бит. потому указатели на мелкие объекты должны иметь одно из 100 млн значений, а указатели на большие обьекты - всего лишь 1 из сотни (из-за выравнивания). Потому указатели на мелкие обьекты состоят из 20 бит, а на большие - из 7 бит.И из-за того. что

нет таких платформ. Нет смысла реализовывать указатели разного размера.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 19.3.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



vinter, DOS.
Там есть far и near указатели.
PM   Вверх
Alek86
Дата 19.3.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



vinter, откуда знаешь?
вопрос на засыпку - есть ли платформы, у которых в байте нецелое число бит?


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 19.3.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



Цитата(bsa @  19.3.2008,  15:38 Найти цитируемый пост)
vinter, DOS.Там есть far и near указатели.


bsa, я думаю DOS во внимание брать не стоит, слишком уже устарела ОС.
Цитата(Alek86 @  19.3.2008,  15:41 Найти цитируемый пост)
вопрос на засыпку - есть ли платформы, у которых в байте нецелое число бит?

есть.
Цитата(Alek86 @  19.3.2008,  15:41 Найти цитируемый пост)
vinter, откуда знаешь?

я догадываюсь.. я таких лично не встречал.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 19.3.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



vinter, в стандарте говорится, что void* может вместить любой другой указатель. Но не говорится, что они все обязаны быть одинакового размера.
PM   Вверх
vinter
Дата 19.3.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

Репутация: 13
Всего: 56



хорошо, поставим вопрос по другому. Назовите хоть одну(из нынедействующих) систем, где используются разные размеры указателей.
Цитата(bsa @  19.3.2008,  16:30 Найти цитируемый пост)
vinter, в стандарте говорится, что void* может вместить любой другой указатель. Но не говорится, что они все обязаны быть одинакового размера.

так с этим никто не спорит, только вот указатели это платформенная фича, а не языковая.



--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 19.3.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



В том то и дело, что указатель - это языковая вещь. На ассемблере понятия указателя нет, есть понятие адрес.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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