C union float trick?

Started by
20 comments, last by sit 18 years, 5 months ago
From the gcc manual:

Quote:
-fstrict-aliasing
Allows the compiler to assume the strictest aliasing rules applicable to the language being compiled. For C (and C++), this activates optimizations based on the type of expressions. In particular, an object of one type is assumed never to reside at the same address as an object of a different type, unless the types are almost the same. For example, an unsigned int can alias an int, but not a void* or a double. A character type may alias any other type.

Pay special attention to code like this:

union a_union {
int i;
double d;
};

int f() {
a_union t;
t.d = 3.0;
return t.i;
}


The practice of reading from a different union member than the one most recently written to (called “type-punning”) is common. Even with -fstrict-aliasing, type-punning is allowed, provided the memory is accessed through the union type. So, the code above will work as expected. However, this code might not:

int f() {
a_union t;
int* ip;
t.d = 3.0;
ip = &t.i
return *ip;
}


Every language that wishes to perform language-specific alias analysis should define a function that computes, given an tree node, an alias set for the node. Nodes in different alias sets are not allowed to alias. For an example, see the C front-end function c_get_alias_set.

Enabled at levels -O2, -O3, -Os.


So DON'T use the pointer cast trick, stick with the union trick.
Advertisement
Quote:Original post by ZQJ
So DON'T use the pointer cast trick, stick with the union trick.

In addition unions are defined to be the size of the larger type they contain

this will not help in this situation for your program [trying to save a double in a union and pull out an int32], but it will keep you from stepping on other things nearby if you use the evil pointer technique

This topic is closed to new replies.

Advertisement