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

Поиск:

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


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

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