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

Поиск:

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


Эксперт
****


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

Репутация: 32
Всего: 101



MAKCim
vinter
Очень хороший пример привел bsa: near и far появились из-за особенностей системы команд.
Конкретный пример разного размера для разных типов привести не могу, но теоретический - пожалуйста. Представьте некий встроенный девайс, у которого разные области памяти, реализованные разными способами с разной разрядностью. Например, ПЗУ и ОЗУ. Некая библиотека С++ для программирования этого девайса возвращает указатели на объекты (часть объектов жестко зашита в ПЗУ) - они будут разного размера.

Кстати разная разрядность ОЗУ и ПЗУ - обычное дело. Возможности адресации вообще-то определяются разрядностью счетчика команд. Если её недостаточно, применяют страничный метод. Это все я к тому, что архитектура процессора - не 100% гарантия свойств С++, на котором он исполняется.
PM MAIL   Вверх
vinter
Дата 19.3.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



baldina, согласен, но мы уже впадаем в лирику.. Так же можно спорить(что когда то и было) что всегда нужно использовать sizeof(char), хотя на привычных нам платформах это 1 байт. Универсальной во всех отношениях программы не напишешь, так что извращения над кодом который "где-то там в теории может пригодится", может вызвать непонимание человека читающего этот самый код, так как он избыточен.
bsa, в принципе игра терминами, указатель хранит адрес, так что можно сказать я неправильно применил термин. Но суть от этого не изменилась. Разрядность адреса все же зависит от платформы, а не от языка.


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


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


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

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



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

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

нет
far указатель - это дополнительная фича борландовского компилятора для поддержки прямой работы с сегментной моделью памяти реального режима в виду ограниченности размера одного сегмента 64K
точно так же дополнительной фичей является концепция указателя на метод в С++
разница лишь в том, что это официальная стандартная фича в отличие от far указателя
и far указатель, и указатель на метод не обязаны инкапсулировать адрес
имплементация не специфицирована




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

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


Эксперт
****


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

Репутация: 32
Всего: 101



Цитата

непонимание человека читающего этот самый код

это вообще сложный вопрос. легче всего читать чужой код человеку, имеющему примерно такой же уровень, что у писавшего.
если рассчитывать на человека, который "все хорошо понимает", то приведение не через void должно вызывать стойкую ассоциацию "в единой модели памяти на подобных этой платформах".
Точно так же описание конструкторов/деструкторов, выполняющих то же, что и генерируемыми по умолчанию, будет вызывать недоумение и раздражение у более опытного. А у менее опытного может вызвать такое же недоумение их отсутствие.

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


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


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

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



Цитата(baldina @  19.3.2008,  17:15 Найти цитируемый пост)
Кстати разная разрядность ОЗУ и ПЗУ - обычное дело. Возможности адресации вообще-то определяются разрядностью счетчика команд. Если её недостаточно, применяют страничный метод. Это все я к тому, что архитектура процессора - не 100% гарантия свойств С++, на котором он исполняется. 

1. ПЗУ также как и ОЗУ отображается на физическое адресное пространство, разрядность которого в рамках определенной процессорной архитектуры фиксировано (например 36 или 40 разрядов на платформах Intel или AMD соответственно)
2. Возможности адресации не всегда определяются разрядностью указателя инструкции
к примеру IA-32e специфицирует 64-х разрядный RIP, хотя линейное адресное пространство ограничено 48-ми разрядами
3. По поводу 100% гарантии, приведите примеры разных свойств

Добавлено через 5 минут и 13 секунд
Цитата(baldina @  19.3.2008,  17:39 Найти цитируемый пост)
то приведение не через void должно вызывать стойкую ассоциацию "в единой модели памяти на подобных этой платформах".

void * определяет адрес объекта
int * определяет адрес объекта
short * определяет адрес объекта
и т. д
размеры их одинаковы и не могут быть различными ни при каких условиях на данной архитектуре
конкретный тип T - это подсказка компилятору, с какими конкретно данными ему предстоит работать


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

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


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


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

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



Цитата(baldina @  19.3.2008,  17:15 Найти цитируемый пост)
near и far появились из-за особенностей системы команд.

система команд здесь не причем


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

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


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(korian @ 18.3.2008,  14:48)
Из книги "Стандарты программирования на 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);
...

Вот только авторы не удосужились объяснить, чем двойное приведение лучше. Пока я вижу лишь то, что эта запись более громоздкая и хуже читается.
PM MAIL   Вверх
korian
Дата 20.3.2008, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UnrealMan @  19.3.2008,  21:17 Найти цитируемый пост)
Вот только авторы не удосужились объяснить, чем двойное приведение лучше

потому, что это гипотетически, имху таких систем не существует, поэтому писать как может быть они не стали.
а вариантов может быть масса, например такой:
чтобы перевести указатель A* в указатель void* - надо сделать смещение битов по кругу на 4 влево
чтобы перевести указатель B* в указатель void* - надо сделать смещение битов по кругу на 8 влево

A* = B* - тупа скопирует биты

void* = A*;
B* = void*; - сделает необходимые преобразования.

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


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


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

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



korian
это чушь
имхо


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

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


Опытный
**


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

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



Цитата(MAKCim @  20.3.2008,  08:23 Найти цитируемый пост)
это чушь
имхо 

это и есть чушь, до тех пор пока не придумают такую платформу... если придумают.
PM   Вверх
MAKCim
Дата 20.3.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(korian @  20.3.2008,  11:49 Найти цитируемый пост)
это и есть чушь, до тех пор пока не придумают такую платформу... если придумают. 

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


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

PM MAIL   Вверх
UnrealMan
Дата 20.3.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(korian @  20.3.2008,  02:45 Найти цитируемый пост)
A* = B* - тупа скопирует биты

void* = A*;
B* = void*; - сделает необходимые преобразования.

Давай-ка не будем сочинять, а? Где в стандарте написано, что reinterpret_cast тупо скопирует биты?

Цитата(5.2.10 Reinterpret cast)
The mapping performed by reinterpret_cast is implementation-defined. [Note: it might, or might not, produce a representation different from the original value. ]

IMHO, разработчикам компилятора ничто не мешает реализовать reinterpret_cast хотя бы через тот же двойной static_cast - в случае, когда тупое копирование битов даст неправильный результат, а двойной static_cast даст правильный результат.

Теперь по поводу преобразования из void* в B*. В общем случае нету никакой гарантии стандарта, что результат будет корректным. Но в случае reinterpret_cast появляется шанс, что компилятор выдаст хотя бы предупреждение о том, что конкретное преобразование из A* в B* невозможно произвести должным образом. Двойной же static_cast через void* компилятор вряд ли будет проверять.
PM MAIL   Вверх
JackYF
Дата 20.3.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  20.3.2008,  15:32 Найти цитируемый пост)
Но в случае reinterpret_cast появляется шанс, что компилятор выдаст хотя бы предупреждение о том, что конкретное преобразование из A* в B* невозможно произвести должным образом.

Наоборот. Оба staticа компилятор проверяет. А вот в случае reinterpret_cast компилятор умывает руки: программист сказал, что там double, и пополам, что по адресу лежал std::map. Надо double - получи double.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 20.3.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(JackYF @  20.3.2008,  19:03 Найти цитируемый пост)
Наоборот. Оба staticа компилятор проверяет. А вот в случае reinterpret_cast компилятор умывает руки: программист сказал, что там double, и пополам, что по адресу лежал std::map. Надо double - получи double. 

Видимо, ты вообще не в курсе, что здесь обсуждается.
PM MAIL   Вверх
korian
Дата 21.3.2008, 05:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что-то с тем примером я перегнул, reinterpret_cast впринципе может выполнить те же самые преобразования...
короче начитался, и вот:

Код

double* d1=...;
int* i1 = reinterpret_cast<int*>(a);
double* d2 = reinterpret_cast<double*>(i1);

double* d3 =...;
void* v1 = d3;
int* i2 = static_cast<int*>(v1);
void*v2 = i2;
double* d4 = static_cast<double*>(v2);


вообщем, что reinterpret_cast, что static_cast, в данном случае undefined, unspecified и implementation-defined.
static_cast есть смысл использовать, потому что стандарт гарантирует, что d3 == d4,
при reinterpret_cast, стандарт не гарантирует, что d1 == d2

и ответ на задачу:
получить реальный указатель на объект, у которого operator & переопределен таким образом, платформо-независимым методом, на чистом C++ нельзя.
можно использовать бустовский addressof, который платформонезависим, как у платформонезависимой библиотеки.
но реализация этой функции платформозависима, и может изменяться от платформы к платформе.

Это сообщение отредактировал(а) korian - 21.3.2008, 06:04
PM   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1021 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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