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

Поиск:

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


Эксперт
***


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

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



Задачка по чистым C++, потому сюда и кидаю.
Если кто знает ответ или задача покажется слишком элементарной, просьба восхищаться собой молча smile

Есть класс

Код

class C {
 //...
public:
 C* operator&() {return NULL;}
 //...
};


Можно ли взять адрес у экземпляра этого класса? Если да, то как?
Решение должно быть по стандарту С++, работать на любых платформах и т.п.


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


Опытный
**


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

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



не знаю, является ли это правильным решением, но вот что у меня получилось:
Код

C obj;
const C& constObj = obj;
const C* objptr = &constObj;

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


Эксперт
***


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

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



тут раньше сморозил...

Это сообщение отредактировал(а) Alek86 - 18.3.2008, 12:34


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


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


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

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



РЕШЕНИЕ ВНИЗУ!!!







&static_cast<const C&>©


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

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


Опытный
**


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

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



да проверил, работает, т.к. оператор не константный.
а вот если еще добавить константный оператор - тада я хз вообще.
Код

class C {
 //...
public:
 C* operator&() {return NULL;}
 C* operator&() const {return NULL;}
 //...
};

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


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


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

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



Цитата(Alek86 @  18.3.2008,  12:32 Найти цитируемый пост)
вызовется C* operator&() {return NULL;} 

нет


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

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


Эксперт
***


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

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



ну, пусть будет добавлен - про константность забыл :(

в оригинале звучало: класс, у которого переопределен опратор &

Это сообщение отредактировал(а) Alek86 - 18.3.2008, 12:39


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


Опытный
**


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

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



нашел решение.






static_cast<C*>(static_cast<C&>(obj))

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


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


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

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



Код

#include <iostream>

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

class A {};

int main() {
    C c;
    std :: cout << (&reinterpret_cast<A&>(c)) << std :: endl;
    return 0;
}



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

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


Опытный
**


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

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



MAKCim
размер указателя на A и размер указателя на C могут отличаться, так что есть вероятность потерять часть данных
PM   Вверх
Alek86
Дата 18.3.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(korian @  18.3.2008,  12:50 Найти цитируемый пост)
нашел решение.

разве можно статиккастить так?

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

ты уверен? в каком случае?

у меня решение было похожее (только A был наследником C и статик каст использовался)


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


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


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

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



вот что нашел :

Функция addressof() возвращает адрес объекта.

...

C++ разрешает программисту заменять унарный оператор в классе operator&() для получения адреса объекта. Получение истинного адреса объекта требует неуклюжих тюков с преобразованием (casting), чтобы избежать вызова перегруженного оператора  operator&(). Функция addressof() обеспечивает обертку для необходимого кода< чтобы упростить получение истинного адреса объекта. 

...

Пример

Код

#include <boost/utility.hpp>

struct useless_type {};
class nonaddressable {
  useless_type operator&() const;
};

void f() {
  nonaddressable x;
  nonaddressable* xp = boost::addressof(x);
  // nonaddressable* xpe = &x; /* error */
}



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


Эксперт
***


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

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



хехе

Код

template <typename T> T*
addressof(T& v)
{
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}  


думаю, это и есть решение... smile


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


Опытный
**


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

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



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

на борланде 6.0 работает  smile 

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

в C++ гарантируется только то что в void* влезит любой указатель, размер остальных указателей может быть любым.
умные люди пишут, что если вы уж решились использовать reinterpret_cast, то лучше делать это так:
int* intptr = reinterpret_cast<int*>(static_cast<void*>(objptr));
насчет "с наследованием" не знаю, поидее тоже должны как-то транслироваться друг в друга. вот только не известно должно ли оно работать, если приводить к наследнику, а сам объект является базовым классом... поидее это не правильно, т.к. получился указатель, на объект которого не существует.

Цитата(mes @  18.3.2008,  12:36 Найти цитируемый пост)
boost::addressof(x);

ну да... чистый C++ ...
PM   Вверх
Alek86
Дата 18.3.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

то есть реализация бустовского addressof некроссплатформенна?

Цитата(korian @  18.3.2008,  13:54 Найти цитируемый пост)
должно ли оно работать, если приводить к наследнику, а сам объект является базовым классом...

должно. у компилера есть вся инфа для этого

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
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   Вверх
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   Вверх
MAKCim
Дата 21.3.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(korian @  21.3.2008,  05:18 Найти цитируемый пост)
получить реальный указатель на объект, у которого operator & переопределен таким образом, платформо-независимым методом, на чистом C++ нельзя.

почему?
объясни, почему этот код платформо-зависим
Код

A a;
&(const int&)a;

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


Это сообщение отредактировал(а) MAKCim - 21.3.2008, 11:15


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

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


Опытный
**


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

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



Цитата(MAKCim @  21.3.2008,  09:59 Найти цитируемый пост)
объясни, почему этот код платформо-зависим

он может и платформо-независим - я не знаю, т.к. это не C++, а C конструкция  smile 
читать про C, о зависимости такой конструкции нет желания, т.к. нету желания читать про C вообще.
И так слишком много лишнего в моск напихали, от которого не знаю как избавиться.

Это сообщение отредактировал(а) korian - 21.3.2008, 11:10
PM   Вверх
baldina
Дата 21.3.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MAKCim, ты убежден, что адрес (любой адрес) - это просто число, номер ячейки памяти, независящее, что лежит по этому номеру. Резоны понятны. Однако: стандарт С++ утверждает, что это не обязательно так.

Добавлено через 1 минуту и 29 секунд
Абстрагируйся от железок. Ты ведь можешь написать компилятор С++ для виртуальной машины, где это не соблюдается, и все в строгом соответствии со стандартом.
PM MAIL   Вверх
MAKCim
Дата 21.3.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(baldina @  21.3.2008,  11:13 Найти цитируемый пост)
ты убежден, что адрес (любой адрес) - это просто число, номер ячейки памяти, независящее, что лежит по этому номеру

да
так оно и есть
Цитата(baldina @  21.3.2008,  11:13 Найти цитируемый пост)
Ты ведь можешь написать компилятор С++ для виртуальной машины, где это не соблюдается, и все в строгом соответствии со стандартом. 

1. что значит компилятор для виртуальной машины?
2. все будет соблюдаться
пусть к примеру есть переменная типа int
абстрагируемся от того, где она расположена
но в любом случае она будет иметь некоторый адрес (опять же абстрагируемся от того, как представим этот адрес)
я получаю этот адрес посредством &
и присваиваю его переменной типа A*, где A - класс
A* определяет адрес
в результате присвоения переменная типа A* будет содержать другой адрес, нежели адрес переменной типа int?
естественно, нет
аналогично со ссылками в случае, если преобразование разрешается компилятором

Добавлено через 4 минуты и 30 секунд
Цитата(korian @  21.3.2008,  11:08 Найти цитируемый пост)
т.к. это не C++, а C конструкция

ошибаешься
это так же С++ конструкция

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


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

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


Опытный
**


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

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



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


Это сообщение отредактировал(а) korian - 21.3.2008, 11:43
PM   Вверх
MAKCim
Дата 21.3.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



korian
попрошу конструктивно
как моя логика теоретически может стать неправильной?
господа, но это же очевидно
если я пишу

int a = 1234
int b = a

то b - всегда и везде будет содержать 1234
аналогично

int a = 1234
int * b = &a;
A * c = (A*)b;

c всегда будет содержать адрес a (если преобразование допустимо компилятором), несмотря на то, что c - другого типа


Это сообщение отредактировал(а) MAKCim - 21.3.2008, 11:48


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

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


Эксперт
****


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

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



Цитата

1. что значит компилятор для виртуальной машины?

тут

Например, MIX. Нетрудно придумать свою, где int и double лежат в принципиально разных областях памяти.

Код

2. все будет соблюдаться

Необязательно. У тебя есть опыт, который говорит, что адреса одинаковые. Попробуй посмотреть со стороны.
Мы знаем, что параллельные прямые не пересекаются и т.п. - тоже на основе опыта.

Не упирайся, поразмышляй. На эту тему флеймить больше не буду. За убеждения получи плюс.  smile 
PM MAIL   Вверх
MAKCim
Дата 21.3.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(baldina @  21.3.2008,  11:53 Найти цитируемый пост)
Например, MIX. Нетрудно придумать свою, где int и double лежат в принципиально разных областях памяти.

ну и пусть себе лежат
никто их и не трогает
пусть даже указатели лежат отдельно
какой код должен быть сгенерирован для этого случая?

A * c = (A*)b

значение b - адрес
оператор (A*) прибавляет к нему какое-то смещение?
вопрос какое? если ему известно только значение b и его тип
таблица отображений A <- offset -> int?
т. е для каждого int создается параллельный объект A?
извините, чушь
во-первых, в этом нет никакого смысла
во-вторых, нарушается семантика, т. к в результате преобразования я получу адрес какого-то неизвестного мне объекта
неизвестно как созданного
задавать таблицы отображения вручную?
а какой в этом смысл, если они мне не нужны?
и где про это в стандарте сказано?
 smile 


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

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


Опытный
**


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

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



Цитата(korian @  21.3.2008,  05:18 Найти цитируемый пост)
вообщем, что reinterpret_cast, что static_cast, в данном случае undefined, unspecified и implementation-defined.

smile Всё смешалось в одну кучу.

Цитата(korian @ 21.3.2008,  05:18)
Код

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);

Цитата(korian @ 21.3.2008,  05:18)
static_cast есть смысл использовать, потому что стандарт гарантирует, что d3 == d4

А подтверждение цитатами из стандарта можно?

Цитата(korian @ 21.3.2008,  05:18)
можно использовать бустовский addressof, который платформонезависим, как у платформонезависимой библиотеки.

Открою страшную тайну: в целом boost - это платформозависимая библиотека.

Добавлено через 4 минуты и 33 секунды
Цитата(korian @  21.3.2008,  11:08 Найти цитируемый пост)
он может и платформо-независим - я не знаю, т.к. это не C++, а C конструкция  

Мдя...

Цитата(korian @  21.3.2008,  11:42 Найти цитируемый пост)
а можно изучать стандарт и писать код, в котором будешь уверен, что он будет работает на любой платформе/операционке, если на этой платформе/операционке есть компилятор C++ соответствующий стандартну

Однако, вот незадача: соответствующим стандарту можно назвать, наверное, лишь Comeau.
PM MAIL   Вверх
korian
Дата 21.3.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UnrealMan @  21.3.2008,  13:30 Найти цитируемый пост)
Всё смешалось в одну кучу.

ну расскажите принципиальную разницу в этих понятиях в данном контексте (прочитайте первый пост и вспомните о чем тут вообще речь)

Цитата(UnrealMan @  21.3.2008,  13:30 Найти цитируемый пост)
А подтверждение цитатами из стандарта можно?

-10- An rvalue of type ``pointer to cv void'' can be explicitly converted to a pointer to object type. A value of type pointer to object converted to ``pointer to cv void'' and back to the original pointer type will have its original value. 

Цитата(UnrealMan @  21.3.2008,  13:30 Найти цитируемый пост)
Открою страшную тайну: в целом boost - это платформозависимая библиотека.

так можно сказать и про STL, если взять платформу, у которой нету стандартного ввода/вывода.

Цитата(UnrealMan @  21.3.2008,  13:30 Найти цитируемый пост)
Однако, вот незадача: соответствующим стандарту можно назвать, наверное, лишь Comeau. 

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


Опытный
**


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

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



Цитата(korian @  21.3.2008,  15:41 Найти цитируемый пост)
A value of type pointer to object converted to ``pointer to cv void'' and back to the original pointer type will have its original value. 

Эта цитата неприменима к твоему примеру, т.к. у тебя не выполняется преобразование из pointer to cv void к оригинальному типу. Относительно приведения не к оригинальному типу стандарт ничего не говорит, что, согласно положению "Undefined behavior may also be expected when this International Standard omits the description of any explicit definition of behavior", можно расценивать как undefined behavior.

Цитата(korian @  21.3.2008,  15:41 Найти цитируемый пост)
ну расскажите принципиальную разницу в этих понятиях в данном контексте 

Каком-таком контексте? Undefined behavior, unspecified behavior и implementation-defined behavior - это три разных термина стандарта, значение которых описано в п. 1.3 Terms et definitions. Поведение reinterpret_cast классифицируется как implementation-defined и потому должно быть описано в документации для каждой реализации. Для двойного static_cast через cv void описания не требуется.

Цитата(korian @  21.3.2008,  15:41 Найти цитируемый пост)
и?

Соблюдая стандарт, нельзя быть уверенным в реальной переносимости программы.
PM MAIL   Вверх
JackYF
Дата 21.3.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(UnrealMan @  20.3.2008,  18:46 Найти цитируемый пост)
Видимо, ты вообще не в курсе, что здесь обсуждается. 

Естественно. И в тему от фонаря написал :/

Цитата(UnrealMan @  21.3.2008,  16:11 Найти цитируемый пост)
Соблюдая стандарт, нельзя быть уверенным в реальной переносимости программы. 

И? Твои предложения?



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


Эксперт
***


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

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



Цитата(JackYF @  21.3.2008,  17:49 Найти цитируемый пост)
И? Твои предложения?

делать как в бусте - #ifdef'ами...


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


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


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

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



Цитата(Alek86 @  21.3.2008,  17:41 Найти цитируемый пост)
делать как в бусте - #ifdef'ами... 

Правильно. Так и делают. Я не понял, к чему это было написано? Иделала нет. Так что, стандарт не соблюдать?


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


Explorer
****


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

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



Цитата(JackYF @  21.3.2008,  21:09 Найти цитируемый пост)
Правильно. Так и делают. Я не понял, к чему это было написано? Иделала нет. Так что, стандарт не соблюдать?

соблюдать, но понимать что на каком нить компиляторе это может не сработать.


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


Эксперт
***


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

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



Цитата(vinter @  21.3.2008,  20:16 Найти цитируемый пост)
соблюдать, но понимать что на каком нить компиляторе это может не сработать.

идеала в нашей жизни нету
помойму, если какой-то нерастпространенный компилер будет еще и свои требования к коду предьявлять, то его заочно втопку (или пускай программисты, на нем работающие, подстраивают свои #ifdef'ы)


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


Опытный
**


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

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



Цитата(UnrealMan @  21.3.2008,  16:11 Найти цитируемый пост)
Эта цитата неприменима к твоему примеру, т.к. у тебя не выполняется преобразование из pointer to cv void к оригинальному типу. Относительно приведения не к оригинальному типу стандарт ничего не говорит, что, согласно положению "Undefined behavior may also be expected when this International Standard omits the description of any explicit definition of behavior", можно расценивать как undefined behavior.

+ вам за разьяснения...
из всего выше сказанного получается, что, если платформа предпологает возможность перевода из T1* в T2*, то reinterpret_cast для такого перевода обязан быть реализован, т.к. reinterpret_cast - implementation-defined. а кастинг через void* из начально undefined и может работать не правильно и реализовываться не обязан. поэтому reinterpret_cast лучше при переводе не связанных типов.
я правильно понял?
по всему инету пишут, что reinterpret_cast хуже потому, что тупа копирует биты, но стандарт не оговаривает, что это должо быть именно так.

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


Опытный
**


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

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



Цитата(korian @  25.3.2008,  09:16 Найти цитируемый пост)
я правильно понял?

Я не могу быть на 100% уверенным, что я сам всё правильно понимаю. Стандарт C++ - штука хитрая, порой встречаешь описание чего-нибудь там, где совсем его не ожидаешь увидеть.

Цитата(korian @  25.3.2008,  09:16 Найти цитируемый пост)
по всему инету пишут, что reinterpret_cast хуже потому, что тупа копирует биты,

Возможно, существует какая-то платформа, где reinterpret_cast криво реализован, а двойной static_cast хорошо отрабатывает, откуда некоторыми людьми делаются выводы в пользу повсеместного применения последнего способа. Но каких-то предпосылок со стороны стандарта для применения такого трюка я не вижу.
PM MAIL   Вверх
JackYF
Дата 25.3.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vinter @  21.3.2008,  19:16 Найти цитируемый пост)
соблюдать, но понимать что на каком нить компиляторе это может не сработать. 

Ну дык и я про что smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.2239 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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