Для чего нужен union?
От: Selectron Россия  
Дата: 27.01.04 14:00
Оценка:
В общем-то, subj...
О заработке в Интернет. Практический опыт.
Re: Для чего нужен union?
От: Bell Россия  
Дата: 27.01.04 14:09
Оценка:
Здравствуйте, Selectron, Вы писали:

S>В общем-то, subj...


Например для экономии памяти.
Любите книгу — источник знаний (с) М.Горький
Re: Для чего нужен union?
От: _nn_ www.nemerleweb.com
Дата: 27.01.04 14:14
Оценка:
Здравствуйте, Selectron, Вы писали:

S>В общем-то, subj...


Для перекрытия несколькими данными одну область памяти.

Использование : экономия памяти, удобство использования.

union A
{
 int i;
 char c[2];
};

union A a;
a.i=10; // a.c[0]=10,a.c[1]=0;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Классический пример
От: BOPOH_N Россия  
Дата: 27.01.04 14:24
Оценка:
struct in_addr {
  union {
        struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;
        struct { u_short s_w1,s_w2; }            S_un_w;
        u_long                                   S_addr;
  } S_un;
};


т.е. мы можем по выбору обращаться с ip адресом, по байтам, по словам и целиком, при этом все в одну и ту-же память

Внесены изменения автора. -- ПК.
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re: Для чего нужен union?
От: VBez  
Дата: 27.01.04 14:28
Оценка:
Да наверное уже и не нужен
Вот в C# и джаве нету — а живут ведь как-то
... << RSDN@Home 1.1.0 stable >>
Re[2]: Для чего нужен union?
От: Bell Россия  
Дата: 27.01.04 14:29
Оценка: 1 (1)
Здравствуйте, _nn_, Вы писали:

__>Использование : экономия памяти, удобство использования.


__>
__>union A
__>{
__> int i;
__> char c[2];
__>};

__>union A a;
__>a.i=10; // a.c[0]=10,a.c[1]=0;
__>


Неудачный пример.
Во-первых, при объявлении/определении объекта ключевое слово union не нужно (если речь о С++):
A a;

Во-вторых, активным может быть только один из элементов объединения, т.е. стандартом запрещается запись в один элемент с последующим чтением из другого (тут правда есть исключение для POD — объединений, подробнее в 9.5/1).

//Так неправильно
A a;
a.i = 10;
char c = a.c[0];

//Так правильно
A a;
a.c[0] = 'a';
char c = a.c[0];
Любите книгу — источник знаний (с) М.Горький
Re[2]: Для чего нужен union?
От: Павел Кузнецов  
Дата: 27.01.04 14:35
Оценка: 1 (1) +1
Здравствуйте, VBez, Вы писали:

V> Да наверное уже и не нужен

V> Вот в C# и джаве нету — а живут ведь как-то

Это одноплатформенные языки (в одном платформа — .Net, в другом — JVM).
Сравнивать с ними C++ некорректно.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Для чего нужен union?
От: _nn_ www.nemerleweb.com
Дата: 27.01.04 16:09
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, _nn_, Вы писали:


__>>Использование : экономия памяти, удобство использования.


__>>
__>>union A
__>>{
__>> int i;
__>> char c[2];
__>>};

__>>union A a;
__>>a.i=10; // a.c[0]=10,a.c[1]=0;
__>>


B>Неудачный пример.

B>Во-первых, при объявлении/определении объекта ключевое слово union не нужно (если речь о С++):
А кто сказал что речь идет о C++ ?

B>
B>A a;
B>

B>Во-вторых, активным может быть только один из элементов объединения, т.е. стандартом запрещается запись в один элемент с последующим чтением из другого (тут правда есть исключение для POD — объединений, подробнее в 9.5/1).

Спасибо, не знал.

B>
B>//Так неправильно
B>A a;
B>a.i = 10;
B>char c = a.c[0];

B>//Так правильно
B>A a;
B>a.c[0] = 'a';
B>char c = a.c[0];
B>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Для чего нужен union?
От: VBez  
Дата: 27.01.04 16:25
Оценка:
V>> Да наверное уже и не нужен
V>> Вот в C# и джаве нету — а живут ведь как-то
ПК>Это одноплатформенные языки (в одном платформа — .Net, в другом — JVM).
ПК>Сравнивать с ними C++ некорректно.

Я сравнивал, как с более молодыми языками.
Наверное когда-то давным-давно, когда деревья были маленькими и памяти на компах стояло по 512Kb, то можно было экономить с помощью union-ов.
А сейчас от них только проблемы будут.
Но это только мое личное IMHO
... << RSDN@Home 1.1.0 stable >>
Re[4]: Для чего нужен union?
От: Павел Кузнецов  
Дата: 27.01.04 16:30
Оценка: +1
Здравствуйте, VBez, Вы писали:

V> Наверное когда-то давным-давно, когда деревья были маленькими и памяти

V> на компах стояло по 512Kb, то можно было экономить с помощью union-ов.

Ты, вероятно, сильно удивишься, если узнаешь, что есть преизрядное количество
выпускаемых ныне компьютеров с памятью порядка 512Kb и меньше?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Для чего нужен union?
От: Bell Россия  
Дата: 27.01.04 16:33
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, VBez, Вы писали:


V>> Наверное когда-то давным-давно, когда деревья были маленькими и памяти

V>> на компах стояло по 512Kb, то можно было экономить с помощью union-ов.

ПК>Ты, вероятно, сильно удивишься, если узнаешь, что есть преизрядное количество

ПК>выпускаемых ныне компьютеров с памятью порядка 512Kb и меньше?

Как я завидую людям, которым не приходится экономить память...
Любите книгу — источник знаний (с) М.Горький
Re[5]: Для чего нужен union?
От: VBez  
Дата: 28.01.04 06:30
Оценка:
V>> Наверное когда-то давным-давно, когда деревья были маленькими и памяти
V>> на компах стояло по 512Kb, то можно было экономить с помощью union-ов.
ПК>Ты, вероятно, сильно удивишься, если узнаешь, что есть преизрядное количество
ПК>выпускаемых ныне компьютеров с памятью порядка 512Kb и меньше?

Для этих компьютеров прекрасно пишутся программы например на джаве. А там нету union-ов.

Для программ написанных под простые компы лучше его не использовать. Во избежание проблем.
Я не говорю, что union — вредная вещь.
Но используется оно очень редко.
Об этом я сужу по очень большим проектам, над которыми работает наша фирма.

PS.
Это конечно только мое IMHO.
... << RSDN@Home 1.1.0 stable >>
Re: Для чего нужен union?
От: LaptevVV Россия  
Дата: 28.01.04 07:58
Оценка:
Здравствуйте, Selectron, Вы писали:

S>В общем-то, subj...

В дополнение ко все ответам напомню:
В системах Борланда (кажется, вплоть до 5-й) есть прекрасный пример реализации электронной таблицы TCALC
Там есть пример использования union — для реализации ячейки таблицы.

struct CELLREC
{
 char attrib;
 union
 {
  char text[MAXINPUT + 1];
  double value;
  struct
  {
   double fvalue;
   char formula[MAXINPUT + 1];
  } f;
 } v;
};
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Для чего нужен union?
От: Павел Кузнецов  
Дата: 28.01.04 08:23
Оценка: 3 (1) +2
Здравствуйте, VBez, Вы писали:

ПК>> Ты, вероятно, сильно удивишься, если узнаешь, что есть преизрядное

ПК>> количество выпускаемых ныне компьютеров с памятью порядка 512Kb и меньше?

V> Для этих компьютеров прекрасно пишутся программы например на джаве.


Хорошо, не 512 килобайт, а 512 байт. Дело не в конкретных цифрах,
а в том, что всегда есть предел, за которым позволить себе дополнительные
прослойки типа .Net и JVM просто нельзя.

Но суть не в этом. При некотором количестве данных даже 2Gb может оказаться
недостаточно большим количеством памяти. union позволяет решать эту проблему.
Если у тебя нет таких проблем — замечательно. Но говорить, что таких проблем
в принципе не существует, и тем более приводить в качестве аргумента языки,
построенные принципиально по-другому, имхо, некорректно.

V> Для программ написанных под простые компы лучше его не использовать.

V> Во избежание проблем.

Каких?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Для чего нужен union?
От: disop Украина  
Дата: 28.01.04 08:24
Оценка:
Здравствуйте, VBez, Вы писали:

VB>Я не говорю, что union — вредная вещь.

VB>Но используется оно очень редко.
Ну ОЧЧЧень редко : "<ProgramFilesDir>\Microsoft Visual Studio\VC98\Include\oaidl.h"
struct  tagVARIANT
    {
    union        {
        struct  __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
.............................


На типе Variant основана передача данных в OLE Automation, например... Да и много еще чего

WBR, DisoP.
Re[7]: Для чего нужен union?
От: VBez  
Дата: 28.01.04 08:53
Оценка:
V>> Во избежание проблем.
ПК>Каких?

Ну например вызов деструктора.
А как страдают от отсутствия деструкторов первое время люди, перешедшие из плюсов например в шарп.
... << RSDN@Home 1.1.0 stable >>
Re[7]: Для чего нужен union?
От: VBez  
Дата: 28.01.04 08:57
Оценка:
D>На типе Variant основана передача данных в OLE Automation, например... Да и много еще чего
Здаюся!!!
... << RSDN@Home 1.1.0 stable >>
Re: Для чего нужен union?
От: Bell Россия  
Дата: 28.01.04 10:21
Оценка:
Здравствуйте, Selectron, Вы писали:

S>В общем-то, subj...


Мож это обсуждение стало причиной, но вот сейчас заюзал union
Ситуация такова:
Есть таблица в базе данных. В этой таблице есть поле (массив char), в котором хранятся значения, смысл которых меняется в зависимости от режима работы приложения.
Есть так же класс, представляющий запись в этой таблице. Соответственно в классе есть мембер, соответствующий полю в таблице. Использование выглядит примерно так:

//Режим 1
const char* SomeClass::GetClientName() { return aClientName_; }
//Режим 2
const char* SomeClass::GetCity() {return aClientName_; }


ИМХО вариант 2 выглядит несколько странновато.
Решение выглядит так:

class SomeClass
{
//...
   union
   {
      char aClientName_[20];
      char aCity_[20];
   };
//...
};

//Режим 1
const char* SomeClass::GetClientName() { return aClientName_; }
//Режим 2
const char* SomeClass::GetCity() {return aCity_; }
Любите книгу — источник знаний (с) М.Горький
Re[8]: Для чего нужен union?
От: Павел Кузнецов  
Дата: 28.01.04 14:10
Оценка: +1
Здравствуйте, VBez, Вы писали:

V>>> Во избежание проблем.


ПК>> Каких?


V> Ну например вызов деструктора.


Не понял... Какие проблемы с вызовами деструкторов связаны с union?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: Для чего нужен union?
От: VBez  
Дата: 28.01.04 14:19
Оценка:
ПК>Не понял... Какие проблемы с вызовами деструкторов связаны с union?

Так не же вызывается автоматом деструктор для того, что находится в union.
Или двойка мне по C++?
... << RSDN@Home 1.1.0 stable >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.