Connecting Tech Pros Worldwide Help | Site Map

Multiple union member initialization

Ricky Lung
Guest
 
Posts: n/a
#1: Jul 22 '05
struct Foo {
union {
int& i;
float& j;
};
Foo(int& val) :
i((int&)val), j((float&)val)
{}
};

GCC will fail to compile the above code because multiple union member is
being initialized.
But if I modify the code to just only init the reference i:
Foo(int& val) :
i((int&)val), j((float&)val)
{}
it also pop out error because reference j is not been initialized.

What's the solution to the above problem? How the C++ standard say about
using reference in union?

--
exmat - C++ matrix library
http://exmat.sourceforge.net


~ Samba, more than a low cost File and Printer server ~

-- Let us OpenSource --


-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
-----== Over 100,000 Newsgroups - 19 Different Servers! =-----
Karl Heinz Buchegger
Guest
 
Posts: n/a
#2: Jul 22 '05

re: Multiple union member initialization


Ricky Lung wrote:[color=blue]
>
> struct Foo {
> union {
> int& i;
> float& j;
> };
> Foo(int& val) :
> i((int&)val), j((float&)val)
> {}
> };
>
> GCC will fail to compile the above code because multiple union member is
> being initialized.
> But if I modify the code to just only init the reference i:
> Foo(int& val) :
> i((int&)val), j((float&)val)
> {}
> it also pop out error because reference j is not been initialized.
>
> What's the solution to the above problem? How the C++ standard say about
> using reference in union?[/color]

I haven't looked it up right now, but if I remember correctly, then
at most *one* member of a union can have an initialization. Since
your union consists of 2 references, and references have to be initialzed ....


--
Karl Heinz Buchegger
kbuchegg@gascad.at
Ricky Lung
Guest
 
Posts: n/a
#3: Jul 22 '05

re: Multiple union member initialization


Yes, and it's a contradiction.

--
exmat - C++ matrix library
http://exmat.sourceforge.net
"Karl Heinz Buchegger" <kbuchegg@gascad.at> wrote in message
news:41234D11.38235458@gascad.at...[color=blue]
> Ricky Lung wrote:[color=green]
> >
> > struct Foo {
> > union {
> > int& i;
> > float& j;
> > };
> > Foo(int& val) :
> > i((int&)val), j((float&)val)
> > {}
> > };
> >
> > GCC will fail to compile the above code because multiple union member is
> > being initialized.
> > But if I modify the code to just only init the reference i:
> > Foo(int& val) :
> > i((int&)val), j((float&)val)
> > {}
> > it also pop out error because reference j is not been initialized.
> >
> > What's the solution to the above problem? How the C++ standard say about
> > using reference in union?[/color]
>
> I haven't looked it up right now, but if I remember correctly, then
> at most *one* member of a union can have an initialization. Since
> your union consists of 2 references, and references have to be initialzed[/color]
.....[color=blue]
>
>
> --
> Karl Heinz Buchegger
> kbuchegg@gascad.at[/color]


~ Samba, more than a low cost File and Printer server ~

-- Let us OpenSource --


-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
-----== Over 100,000 Newsgroups - 19 Different Servers! =-----
Richard Herring
Guest
 
Posts: n/a
#4: Jul 22 '05

re: Multiple union member initialization


In message <41241ac4@usenet.hk>, Ricky Lung <ricky@y-trace.com> writes[color=blue]
>struct Foo {
> union {
> int& i;
> float& j;
> };
> Foo(int& val) :
> i((int&)val), j((float&)val)[/color]

All other considerations aside, how could you initialise a reference to
float using an int? What would you expect to happen?
[color=blue]
> {}
>};
>
>GCC will fail to compile the above code because multiple union member is
>being initialized.
>But if I modify the code to just only init the reference i:
>Foo(int& val) :
> i((int&)val), j((float&)val)
> {}
>it also pop out error because reference j is not been initialized.
>
>What's the solution to the above problem? How the C++ standard say about
>using reference in union?
>[/color]

What's the problem you're trying to solve by using a union?

--
Richard Herring
Ricky Lung
Guest
 
Posts: n/a
#5: Jul 22 '05

re: Multiple union member initialization


The long stor is, I am make a matrix class with SIMD enabled.
Some specific funtion I needed to use Intel SSE intrinsic function like
_mm_add_ps.
Therefore I want to keep the intrinsic type and a C-array in a union
something like
union {
__m128;
float[4];
};

But problem comes out when I use reference (because of some reason, I have
to use reference).
Since the cost of one reference is 4 bytes, by using union of reference, the
size of my object (reference to vector of 4 flaot) will be just 4 bytes
insteal of 8 bytes. That the reason I use union of reference

--
exmat - C++ matrix library
http://exmat.sourceforge.net

"Richard Herring" <junk@[127.0.0.1]> wrote in message
news:E9k5DhfqZ1IBFwMY@baesystems.com...[color=blue]
> In message <41241ac4@usenet.hk>, Ricky Lung <ricky@y-trace.com> writes[color=green]
> >struct Foo {
> > union {
> > int& i;
> > float& j;
> > };
> > Foo(int& val) :
> > i((int&)val), j((float&)val)[/color]
>
> All other considerations aside, how could you initialise a reference to
> float using an int? What would you expect to happen?
>[color=green]
> > {}
> >};
> >
> >GCC will fail to compile the above code because multiple union member is
> >being initialized.
> >But if I modify the code to just only init the reference i:
> >Foo(int& val) :
> > i((int&)val), j((float&)val)
> > {}
> >it also pop out error because reference j is not been initialized.
> >
> >What's the solution to the above problem? How the C++ standard say about
> >using reference in union?
> >[/color]
>
> What's the problem you're trying to solve by using a union?
>
> --
> Richard Herring[/color]


~ Samba, more than a low cost File and Printer server ~

-- Let us OpenSource --


-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
-----== Over 100,000 Newsgroups - 19 Different Servers! =-----
Richard Herring
Guest
 
Posts: n/a
#6: Jul 22 '05

re: Multiple union member initialization


In message <4124f6e2$1@usenet.hk>, Ricky Lung <ricky@y-trace.com> writes

[please don't top-post]
[color=blue]
>--[/color]

[please don't put quoted material after your sig-separator - any
reasonable news client truncates it, making sensibly-quoted followups
difficult]
[color=blue]
>"Richard Herring" <junk@[127.0.0.1]> wrote in message
>news:E9k5DhfqZ1IBFwMY@baesystems.com...[color=green]
>> In message <41241ac4@usenet.hk>, Ricky Lung <ricky@y-trace.com> writes[color=darkred]
>> >struct Foo {
>> > union {
>> > int& i;
>> > float& j;
>> > };
>> > Foo(int& val) :
>> > i((int&)val), j((float&)val)[/color]
>>
>> All other considerations aside, how could you initialise a reference to
>> float using an int? What would you expect to happen?[/color][/color]

I still don't understand what you think you're doing here.[color=blue][color=green]
>>[color=darkred]
>> > {}
>> >};
>> >
>> >GCC will fail to compile the above code because multiple union member is
>> >being initialized.
>> >But if I modify the code to just only init the reference i:
>> >Foo(int& val) :
>> > i((int&)val), j((float&)val)
>> > {}
>> >it also pop out error because reference j is not been initialized.
>> >
>> >What's the solution to the above problem? How the C++ standard say about
>> >using reference in union?[/color]
>>
>> What's the problem you're trying to solve by using a union?
>>[/color]
>The long stor is, I am make a matrix class with SIMD enabled. Some
>specific funtion I needed to use Intel SSE intrinsic function like
>_mm_add_ps.[/color]

So we're off-topic for standard C++. Nevertheless...
[color=blue]
>Therefore I want to keep the intrinsic type and a C-array in a union
>something like
>union {
> __m128;
> float[4];
>};[/color]

Fair enough, though you could equally use reinterpret_cast.[color=blue]
>
>But problem comes out when I use reference (because of some reason, I
>have to use reference). Since the cost of one reference is 4 bytes, by
>using union of reference, the size of my object (reference to vector of
>flaot) will be just 4 bytes insteal of 8 bytes.[/color]

Plus the 8 bytes somewhere else that it references. Reference members
don't save space, they just indirect. Under the hood, at the assembler
level it's just implemented as a pointer.
[color=blue]
>That the reason I use union of reference
>[/color]
You're using the union to alias two data items of different types. The
references are indirections (in effect pointers) so you end up aliasing
the pointers, not the data. I suspect that isn't what you intend.

--
Richard Herring
Closed Thread