|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.08.2014, 01:14 | #1 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Добрый день.
Начитался про ужасы aliasing'a, решил изучить вопрос. Ни одного раза не удалось воспроизвести проблемные коды, которые имеются в сети. Возможно gcc поумнел. Например, накидал такой код: Код:
Код:
Код:
Чего я хочу? Хочу понять - как правильно создавать несколько указателей разного (сильно) типа на один объект. Везде о говорят об использовании union'ов, но в справочнике написано, что обращение к неактивному полю union - UB, это расширение компиляторов. Из справочника http://en.cppreference.com/w/cpp/lan...interpret_cast: Код:
Последний раз редактировалось Stilet; 30.08.2014 в 09:00. |
30.08.2014, 07:27 | #2 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Цитата:
Если очень надо, каст всегда можно делать либо через С каст - (type) expression, либо (в случае с указателями) через void*. Естественно, размер указателей должен совпадать с размер void указателя. Зачем делать *очень* разные по типу указатели на один и тот же объект? Откуда например будет браться тип объекта? Не лучше ли использовать виртуальный методы? Последний раз редактировалось waleri; 30.08.2014 в 07:30. |
|
30.08.2014, 13:11 | #3 | |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Цитата:
"Заметьте, что многие компиляторы реализуют отключение этого правила (type aliasing rule), как нестандартное расширение языка если неправильный доступ к типу произведен через неактивный член union (неактивный член - член, чтение которого не следует за записью в тот же член)." "Многие компиляторы реализуют, как нестандартное расширение языка, возможность чтения неактивного члена union." В общем, стандарт не ограничивает компилятор при оптимизации union'в. Как следствие, при написании следующего: Код:
Последний раз редактировалось 220Volt; 30.08.2014 в 13:13. |
|
30.08.2014, 16:00 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А можно для любопытствующих ссылку на русский ресурс рассказывающий что это такое Type aliasing?
I'm learning to live...
|
30.08.2014, 16:16 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
А при чем тут юнион, разве это не относится к записи любых переменных?
|
30.08.2014, 16:47 | #6 | |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Цитата:
На ваш взгляд, применение union подобным способом не решит часть вопросов при которых может прийти в голову делать reinterpret_cast? Вот здесь товарищ не плохо развернуто ответил, правда на английском http://stackoverflow.com/questions/9...le/99010#99010. Но такое использование union не попадает под стандарт. Последний раз редактировалось Stilet; 30.08.2014 в 17:10. |
|
30.08.2014, 17:12 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
30.08.2014, 20:04 | #8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Там вроде написано "This is allowed in C99 and explicitly allowed in C11."
Не так страшен черт как его малюют. Ведь если все было так, никогда нельзя будет прочитать никакие данные, ведь получение адреса на int переменную - тот же aliasing. |
30.08.2014, 21:13 | #9 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Вот еще неплохая статья: http://dbp-consulting.com/StrictAliasing.pdf
Вроде разобрался, резюмировал (от себя ничего не добавлял, только комментарии): Код:
Последний раз редактировалось 220Volt; 31.08.2014 в 01:02. |
30.08.2014, 21:46 | #10 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Хм... Если честно то я для себя нашел еще одну причину поменьше использовать открытые указатели... Впрочем я не в курсах как действует компиль паскаля в подобных ситуациях. Это я типа оффтоплю...
I'm learning to live...
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить? | Mitax-47 | Помощь студентам | 1 | 10.05.2013 15:48 |
Could not convert variant of the type (String) into type (Boolean) | Silly Student | C++ Builder | 0 | 19.11.2011 13:06 |
Отличие type T = Object от type T = Class? | Warn | Общие вопросы Delphi | 8 | 04.11.2011 19:20 |
Could not convert variant of type (Olestr) into type (Double) | java_91 | Общие вопросы Delphi | 1 | 18.02.2011 18:46 |
Could not convert variant of type (UnicodeString) into type (Double) | postaveche | БД в Delphi | 11 | 13.12.2010 16:41 |