Multiple union member initialization

R

Ricky Lung

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 --
 
K

Karl Heinz Buchegger

Ricky said:
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 ....
 
R

Ricky Lung

Yes, and it's a contradiction.

--
exmat - C++ matrix library
http://exmat.sourceforge.net
Karl Heinz Buchegger said:
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 .....


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

-- Let us OpenSource --
 
R

Richard Herring

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?
 
R

Ricky Lung

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 said:
All other considerations aside, how could you initialise a reference to
float using an int? What would you expect to happen?


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


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

-- Let us OpenSource --
 
R

Richard Herring

--[/QUOTE]

[please don't put quoted material after your sig-separator - any
reasonable news client truncates it, making sensibly-quoted followups
difficult]

I still don't understand what you think you're doing here.
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top