By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,898 Members | 2,022 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,898 IT Pros & Developers. It's quick & easy.

Multiple union member initialization

P: n/a
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! =-----
Jul 22 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Ricky Lung wrote:

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?


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
kb******@gascad.at
Jul 22 '05 #2

P: n/a
Yes, and it's a contradiction.

--
exmat - C++ matrix library
http://exmat.sourceforge.net
"Karl Heinz Buchegger" <kb******@gascad.at> wrote in message
news:41***************@gascad.at...
Ricky Lung wrote:

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?
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
kb******@gascad.at

~ 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! =-----
Jul 22 '05 #3

P: n/a
In message <41******@usenet.hk>, Ricky Lung <ri***@y-trace.com> writes
struct Foo {
union {
int& i;
float& j;
};
Foo(int& val) :
i((int&)val), j((float&)val)
All other considerations aside, how could you initialise a reference to
float using an int? What would you expect to happen?
{}
};

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?


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

--
Richard Herring
Jul 22 '05 #4

P: n/a
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" <ju**@[127.0.0.1]> wrote in message
news:E9**************@baesystems.com...
In message <41******@usenet.hk>, Ricky Lung <ri***@y-trace.com> writes
struct Foo {
union {
int& i;
float& j;
};
Foo(int& val) :
i((int&)val), j((float&)val)


All other considerations aside, how could you initialise a reference to
float using an int? What would you expect to happen?
{}
};

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?


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

--
Richard Herring

~ 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! =-----
Jul 22 '05 #5

P: n/a
In message <41********@usenet.hk>, Ricky Lung <ri***@y-trace.com> writes

[please don't top-post]
--
[please don't put quoted material after your sig-separator - any
reasonable news client truncates it, making sensibly-quoted followups
difficult]
"Richard Herring" <ju**@[127.0.0.1]> wrote in message
news:E9**************@baesystems.com...
In message <41******@usenet.hk>, Ricky Lung <ri***@y-trace.com> writes
>struct Foo {
> union {
> int& i;
> float& j;
> };
> Foo(int& val) :
> i((int&)val), j((float&)val)
All other considerations aside, how could you initialise a reference to
float using an int? What would you expect to happen?
I still don't understand what you think you're doing here.
> {}
>};
>
>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?


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

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.


So we're off-topic for standard C++. Nevertheless...
Therefore I want to keep the intrinsic type and a C-array in a union
something like
union {
__m128;
float[4];
};
Fair enough, though you could equally use reinterpret_cast.
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.
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.
That the reason I use union of reference

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
Jul 22 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.