Форум программистов, компьютерный форум, киберфорум
Наши страницы

Union что из себя представляет? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Скрипт для автоматизации забивания инфы http://www.cyberforum.ru/cpp-beginners/thread161901.html
Есть такая проблема.... Имеется сайт......на нём есть какталог товаров.....забивается каталог через админку.... знач вводятся следующие поля ... наименования товара.... описание ..... цена........
C++ Как установить весь MinGW? Собственно сабж. Дома у меня Линукс и проблем не возникает. А на работе винда. Я использую Эклипсу с МинГВином, но нехватает Autoconf. Сабжевый инсталятор тянет только базовую систему. Выкачивать... http://www.cyberforum.ru/cpp-beginners/thread161835.html
Сравнение элементов массива C++
Доброе время суток. У меня такой вопрос. Как сравнить элементы массива,допустим массив состоит из пяти элентов???
C++ Статические поля класса
class mi { int a,b; public: mi(int a, int b) : a(a),b(b) {} void sw() { std::cout<<a<<" - "<<b<<std::endl; } static int pa = 9; }; мне нужно сделать переменную в...
C++ Советы http://www.cyberforum.ru/cpp-beginners/thread161822.html
Добрый день, сделал с горем пополам калькулятор, но необходимы советы о написании программ на примере того же калькулятора, так как было довольно заморочливо его делать и программа похожа на if-then...
C++ Уникальные массивы Здравствуйте, подскажите пожалуйста как на С реализовывается уникальность массивов. Чтобы в массив попадали только те элементы, которые являются уникальными. Чтобы читая файл на выходе можно было... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18264 / 6389 / 440
Регистрация: 30.03.2009
Сообщений: 17,674
Записей в блоге: 28
22.06.2016, 09:59
Цитата Сообщение от IGPIGP Посмотреть сообщение
Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес
Дело тут не в объектах. Пока внутри одной функции строятся обращения к разным полям одного и того же union'а, даже плохой компилятор постфактум в этом разберётся и ничего не напортачит. В реальности всё это вертится вокруг взятия адреса на поля union'а. В примере типа

C
int foo (int *p1, float *p2)
{
  *p2 = 0.0f;
  return *p1;
}
имеем обращения по двум указателям: запись по указателю p2 и чтение по указателю p1. Опираясь на Strict aliasing rules компилятор вправе переставить местами операции чтения и записи в память, т.к. эти самые strict aliasing rules говорят о том, что обращения по указателям типа int* и float* обязаны иметь непересекающиеся адреса (т.е. независимые обращения) и следить за этим должен программист. Другими словами, если построить вызов функции

C
union { int i; float f; } u;
int i;
...
u.i = 0x11111111;
i = foo (&u.i, &u.f);
то нет никакой гарантии, что в i будет записано нулевое значение, потому что внутри функции foo компилятор может переставить местами чтение из p1 (т.е. из поля u.i) и запись в p2 (т.е. в поле u.f). Это именно с точки зрения стандарта. Хотя постфактум на современных компиляторах данный код отработает именно так, что в i будет записан 0
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru