Connecting Tech Pros Worldwide Help | Site Map

Multiple union member initialization

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 22nd, 2005, 06:00 PM
Ricky Lung
Guest
 
Posts: n/a
Default Multiple union member initialization

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! =-----

  #2  
Old July 22nd, 2005, 06:00 PM
Karl Heinz Buchegger
Guest
 
Posts: n/a
Default 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
  #3  
Old July 22nd, 2005, 06:01 PM
Ricky Lung
Guest
 
Posts: n/a
Default 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! =-----
  #4  
Old July 22nd, 2005, 06:01 PM
Richard Herring
Guest
 
Posts: n/a
Default 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
  #5  
Old July 22nd, 2005, 06:02 PM
Ricky Lung
Guest
 
Posts: n/a
Default 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! =-----
  #6  
Old July 22nd, 2005, 06:02 PM
Richard Herring
Guest
 
Posts: n/a
Default 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
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.