俺は使わないけど。
なんに使って良いのか、全然解んないけど。
3 :
デフォルトの名無しさん:05/02/20 13:23:36
>>1 俺は使うけど。
無駄をなくすのに使っていいのか、全然解んないけど。
strict aliasing
)
_ ノ 出席番号8番
_,, ---- 、_ | | /> ⌒`'⌒ヽ パイパンの
_,,-ァ''" ヽ、| レ'∠_, ) 神楽坂明日菜様が
/ /⌒"''ー 、 " 「 ⌒ ヽ、/)、 ⌒ヽ
>>8ゲット!
___/ ヽ ヽ、 { , 勹 `、ヽ )
,ン''フ {~ ⌒ヽ、 ヽ、`ヽ\/ ノ 、、 \\ ⌒Y⌒Y⌒
、/ / { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
/ \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、 l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
/ iニニ/ i | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ } ヽ ヽ \::.. \ ̄ ̄ ̄ ̄ ̄
./ l イ| ト| \ヽ / >イ)⌒ト`l |ヽ))) | ヽ \ \::.. \ /
/ |.l ハ | |、_,,,,,,__ \ ヽ、, 〉 l レノ/ \ ヽ \::::.... ヽ、/::::::::
/ |l ~ヽ .トイ、 i个、 /// レ 「ヽl _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
{ !. トヾ、ヽヽヽ)i , -、 》⌒>' / ヽ、、 二二ニニニニニニニ
| ト、!ト`ヽ ` < ィ ) / 〃/ / __________\_/::::::::\:::::::::::::::::::
| ト\ヽ \,_ `ヽン ,イ// / i | ,,,,---ヽ :::::::;`> 、;;;;;;;;
| ハヽ `ヽ\`二ニ='ツク ,/./ ハ l (二" `ヽ<
|l ヽ_` (三三三ニア/ | i |  ̄"""'''''''''----`----、
/ニニニニニニ===ー''ァ彡ソ、 ノ i ___,,,,-----
_,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
///,, -'7 { |彡へ .} ヽ、::::::::::::....
昔の事じゃがのぉ、記憶域がたりんで、ビットフィールドとunion使いまくったで。
)
_ ノ 出席番号8番
_,, ---- 、_ | | /> ⌒`'⌒ヽ パイパンの
_,,-ァ''" ヽ、| レ'∠_, ) 神楽坂明日菜様が
/ /⌒"''ー 、 " 「 ⌒ ヽ、/)、 ⌒ヽ
>>8ゲット!
___/ ヽ ヽ、 { , 勹 `、ヽ )
,ン''フ {~ ⌒ヽ、 ヽ、`ヽ\/ ノ 、、 \\ ⌒Y⌒Y⌒
、/ / { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
/ \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、 l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
/ iニニ/ i | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ } ヽ ヽ \::.. \ ̄ ̄ ̄ ̄ ̄
./ l イ| ト| \ヽ / >イ)⌒ト`l |ヽ))) | ヽ \ \::.. \ /
/ |.l ハ | |、_,,,,,,__ \ ヽ、, 〉 l レノ/ \ ヽ \::::.... ヽ、/::::::::
/ |l ~ヽ .トイ、 i个、 /// レ 「ヽl _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
{ !. トヾ、ヽヽヽ)i , -、 》⌒>' / ヽ、、 二二ニニニニニニニ
| ト、!ト`ヽ ` < ィ ) / 〃/ / __________\_/::::::::\:::::::::::::::::::
| ト\ヽ \,_ `ヽン ,イ// / i | ,,,,---ヽ :::::::;`> 、;;;;;;;;
| ハヽ `ヽ\`二ニ='ツク ,/./ ハ l (二" `ヽ<
|l ヽ_` (三三三ニア/ | i |  ̄"""'''''''''----`----、
/ニニニニニニ===ー''ァ彡ソ、 ノ i ___,,,,-----
_,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
///,, -'7 { |彡へ .} ヽ、::::::::::::....
言語処理系を作る奴は union を使いまくる。
)
_ ノ 出席番号8番
_,, ---- 、_ | | /> ⌒`'⌒ヽ パイパンの
_,,-ァ''" ヽ、| レ'∠_, ) 神楽坂明日菜様が
/ /⌒"''ー 、 " 「 ⌒ ヽ、/)、 ⌒ヽ
>>8ゲット!
___/ ヽ ヽ、 { , 勹 `、ヽ )
,ン''フ {~ ⌒ヽ、 ヽ、`ヽ\/ ノ 、、 \\ ⌒Y⌒Y⌒
、/ / { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
/ \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、 l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
/ iニニ/ i | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ } ヽ ヽ \::.. \ ̄ ̄ ̄ ̄ ̄
./ l イ| ト| \ヽ / >イ)⌒ト`l |ヽ))) | ヽ \ \::.. \ /
/ |.l ハ | |、_,,,,,,__ \ ヽ、, 〉 l レノ/ \ ヽ \::::.... ヽ、/::::::::
/ |l ~ヽ .トイ、 i个、 /// レ 「ヽl _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
{ !. トヾ、ヽヽヽ)i , -、 》⌒>' / ヽ、、 二二ニニニニニニニ
| ト、!ト`ヽ ` < ィ ) / 〃/ / __________\_/::::::::\:::::::::::::::::::
| ト\ヽ \,_ `ヽン ,イ// / i | ,,,,---ヽ :::::::;`> 、;;;;;;;;
| ハヽ `ヽ\`二ニ='ツク ,/./ ハ l (二" `ヽ<
|l ヽ_` (三三三ニア/ | i |  ̄"""'''''''''----`----、
/ニニニニニニ===ー''ァ彡ソ、 ノ i ___,,,,-----
_,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
///,, -'7 { |彡へ .} ヽ、::::::::::::....
11 :
デフォルトの名無しさん:05/02/20 14:43:56
union{
int WindowsActivationDisablizer;
int AccessHereToWarez;
} YattaIkematen;
文法これで合ってるかな・・・
12 :
デフォルトの名無しさん:05/02/20 14:46:58
アラインメントを保証するために使ったりとか
エンディアンを確認するためとか
13 :
デフォルトの名無しさん:05/02/20 15:07:31
アライグマを保護するために使ったりとか
インディアンを確保するためとか
共用体なんてのが意味を持ってたのはメモリが少なかった昔の話。
メモリがふんだんに使える今、あえて使う理由などない。
かえってバグの原因になる。
一度も使ったこと無いや。
良いことなのか悪いことなのか、幸福なのか不幸なのか、その辺知らんけど。
16 :
デフォルトの名無しさん:05/02/21 00:53:16
クラス継承のお陰で不要になった
17 :
デフォルトの名無しさん:05/02/21 02:31:55
struct hoge {
int type
union {
...
} u;
};
こんな感じのコードを昔はよく書いたな。
type のところとかどうせ利用側で
switch 使いまくらないといけないのが結局無駄
インテルのCPUからプロセッサ情報
取得する時はunion使うよね
文字列を逆にしないといけないが。
20 :
デフォルトの名無しさん:05/02/21 23:05:12
>>17 これが正しい文法だ。
今後のWindowsではなw
[StructLayout(LayoutKind.Explicit)]
public struct YattaIkematen
{
[FieldOffset(0)]public int WindowsActivationDisablizer;
[FieldOffset(0)]public int AccessHereToWarez;
}
22 :
デフォルトの名無しさん:05/02/22 08:47:13
共用体を使うとメモリの節約になるのって
どんなとき?
そんなケース、想定できないんだけど
bison使うと嫌でもunion漬け
24 :
デフォルトの名無しさん:05/02/22 10:21:58
struct st_itu0 { /* struct ITU0 */
union { /* TCR */
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char wk :1; /* */
unsigned char CCLR:2; /* CCLR */
unsigned char CKEG:2; /* CKEG */
unsigned char TPSC:3; /* TPSC */
} BIT; /* */
} TCR; /* */
union { /* TIOR */
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char wk :1; /* */
unsigned char IOB:3; /* IOB */
unsigned char :1; /* */
unsigned char IOA:3; /* IOA */
} BIT; /* */
} TIOR; /* */
union { /* TIER */
>>22 union をメモリ節約のために使うなぞ、莫迦のする事。
じゃあなんの為に使うのかというと……正直、使い道なんかない。
複数の構造体を並べて、その最大サイズでメモリに割り付けられるくらい。
>>17 Xlib には、そーゆーのが現存する。
tp://xjman.dsl.gr.jp/X11R6/X11/CH10.html
複数のメンバのうち、同時に二個以上持つことが無い場合なんかに(名前で明確に区別できて)有用じゃない?
struct WORDREGS { struct BYTEREGS {
unsigned int ax; unsigned char al, ah;
unsigned int bx; unsigned char bl, bh;
unsigned int cx; unsigned char cl, ch;
unsigned int dx; unsigned char dl, dh;
unsigned int si; };
unsigned int di;
unsigned int cflag;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
こう言う使い方するためにある
struct WORDREGS {
unsigned int ax;
unsigned int bx;
unsigned int cx;
unsigned int dx;
unsigned int si;
unsigned int di;
unsigned int cflag;
};
struct BYTEREGS {
unsigned char al, ah;
unsigned char bl, bh;
unsigned char cl, ch;
unsigned char dl, dh;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
class Base {}:
class E1 : public Base {};
class E2 : public Base {};
class E3 : public Base {};
のとき、
union E {
Base* b;
E1* e1;
E2* e2;
E3* e3;
};
として、「失敗しないダイナミックキャスト(じゃ無いけど、それに似た何か)」を表現できないだろうか
E e;
e.b = new Base();
e.e3->funce3();
簡単にクラッシュですね
>>29 は多態を実現したいのか?
それなら最初から Base *b = new E3(); で問題ないだろ?
>>20 なるほど
それが噂のC#か
幕メインになりそうなんで今後使うかどうかかなり謎だが
複雑な文法だな
何がなんだか
>>20は、ネイティブのDLLで使われてる共用体を使うためのC#共用体宣言。
C#本来の仕組みで共用体っぽいものを実現するなら、
こんな実装になるかねぇ。
public class YattaIkematen{
private int number;
public int WindowsActivationDisablizer{
get{
return number;
}
set{
number = value;
}
}
public int AccessHereToWarez{
get{
return number;
}
set{
number = value;
}
}
}
>>33 まぁようするにオブジェクト指向とゆうわけだな
徹底しとりますな
ある意味使いやすそうな気はしないでもない
typedef struct tagPOINT
{
unsigned short x;
unsigned short y;
} POINT;
typedef struct tagRECT
{
union {
struct {
unsigned short Left, Top, Right, Bottom;
};
struct {
tagPOINT TopLeft, BottomRight;
}
}
} RECT;
RECT rect;
rect.Left = 10;
rect.Top = 20;
rect.BottomRight.x = 100
みたいなことってできなかったっけ?
37 :
デフォルトの名無しさん:05/02/24 22:19:58
( ゚д゚)ポカーン
Cなら、
>>17のような使い方で共用体は普通に使う(もちろんC++じゃ出番なし)。
Cの入門書の良し悪しを判定するには共用体の説明を見ればいい、って説があったけど、
このスレの連中は糞本しか読んでないのか。
C言語自体の入門書読まずにプログラミング始めたからなぁ
自分の書いたコードではunion確か使ってないし
>>37 俺は、似たようなことをやるのに、共用体じゃなくて
typedef struct{
void* data;
void ( *func1 )( void );
int (*func2)( int n );
}
こんな感じで、汎用のバッファにmallocして、
関数ポインタに、それを処理する関数を登録する方法でやってた。
今から思えば、クラスと仮想関数だな…
>>14 へぇ。
ヘッダ部は同じでエンベロープが数種類ある通信フォーマットにはめ込んで使ったりします。
union body{
struct format_a a_shiten_data;
struct format_a old_a_shiten_data;
struct format_a b_shiten_data;
}
struct data{
struct head header;
union body bodies;
}
struct data dat;
recv(sock,&dat,sizeof(dat));
switch(dat.type){
case 1:
dat.a_shiten_data〜
case 2:
dat.a_old_shiten_data〜
・・・
}
旧時代の化石は業界から消えろ
>>41 物事の本質を見なさい。
ただのプログラマ。
>>42 あれですか?
10年前に引退しそこなった中年さんですか?
プログラマとしてヘタレだったオッサンほど
「ただの管理職」になって、
自分の知らない実装技術=業務には使えないオナニー
って発想で会社をグダグダにするんだよね。
ま、そんなオッサンは、ITゼネコンのクローズドな自治体システムの保守でもやって
細々と食いつないでくれたまえ。
で、頼むから外の世界に出てこないでね^^
46 :
デフォルトの名無しさん:05/02/25 01:16:30
Pascalやってたせいでレコード型の可変部のイメージで共用体を
>>17のように使っていた。
共用体の方がシンプルで自由度が高いのでそうじゃない使い方も行き当たりばったりで使ったりしている。
>>40のコードは、軽く考えただけでも
・同じエンディアンのマシンで
・同じパディングのコンパイラで
・同じメモリイメージを展開するネットワークライブラリ
じゃないと動かなくなるな。
まぁ、永久に同じ汎用機をメーカーから定価で買い続けて
ソフトも同じものを永久に使い続けるなら、これでいいか。
struct Color{
union{
struct{
float r,g,b,a;
};
float[4];
}
}
こうすると初期化のときとかfor文が使えて便利。
エンディアンとかは考えてないが。
>>48 この場合、エンディアンは全く関係ないね。
>>49 struct Color color = { 0.0f, 0.0f, 0.0f, 0.0f };
じゃいかんのか?
構造体の初期化式を知らない?
>>50 初期化式なんて宣言のときしか書けないし、定数式しか書けないしで、
使える範囲がかなり限定されると思うが。
たとえばこんなのは、
typedef struct {
union {
struct {
double x;
double y;
double z;
} s;
double a[3];
}
} Point3D;
行列かけたりする時には便利だろうね。邪悪な気がするので俺はやらないが。
Colorの場合の用途は俺はよく知らんが、画像フィルタやら何やらで使い道はあるんだろ。
52 :
デフォルトの名無しさん:05/02/25 21:09:24
>>50 構文上の初期化じゃないんじゃない?
グラデーションの色テーブルとか
>>47 ん?なんで?
共用体で定義してる構造体間には何の関連もないよ。
どのデータ構造を受信したかは共通のヘッダ部に記述してある。
それによって使う構造体を変える。
intの変数をchar4つでも見たいなぁ。的な共用体の使い方とは根本的に違います。
ネットワークバイトオーダとマシンのバイトオーダが違う場合は当然エンディアン変換を行います。
アライメントは調整するのは当たり前として。
recvで取ってきてるように送られてくるのはソケットからのストリームなのでリニアに綺麗に並ぶはずですね。
アライメントをあわす前提ならば問題ないです。
「Color」は適当な例が無かったから適当につけただけなのであんまりこだわらないでほしいなぁ。
僕は、まー、Colorをメタセコのパーサーで使ってるんだけど、どうだろう・・・。
sscanfとか、iostreamで、わざわざ各要素ごとに指定するのは面倒なんで、こういう方法をとっている。
より良い方法は模索中である。
55 :
デフォルトの名無しさん:05/02/26 12:37:18
struct Color{
union{
struct{
float r,g,b,a;
};
float[4];
}
}
タグ名ないときは
Color c;
c.r
c.g
c.b
c.a
でアクセスできるの?
57 :
デフォルトの名無しさん:05/02/26 14:47:47
c[0]
c[1]
とかもOK?
59 :
デフォルトの名無しさん:05/02/26 19:59:34
>>57 operator[](int index)をメンバとして定義すればいいね。union使わないとできない手法だね。
ただし
>>55のような無名unionのショートカット的参照は正式な文法じゃないのだが。
どうような手法はC・C++でSSEを使うときには__m64,__m128を使うんだけど
こいつらからfloat,doubleを取り出すときにつかうね。
sage忘れorz
あらゆるオブジェクトをさす事が出来る void* ってのがあるが、
それのオブジェクト(っていうか実体)バージョンが
unionだと思えばよいのかな。
そう思う事にしようっと。
大誤解。
voidクラスがあるとすれば正解?
あろうがなかろうが違う
65 :
デフォルトの名無しさん:05/03/06 15:58:17
>>24 ITU・・・H8かw
組み込み系の人間は少ないのか?
組み込み系だと当然の様に使う。
なぜなら、ハード的な入出力(CPUのI/O)は、ビットで入ってくるからね。
union{
uchar BYTE;
struct{
}
}
途中でおくちゃった・・・
union{
uchar BYTE;
struct{
uchar b7:1;
uchar b6:1;
uchar b5:1;
uchar b4:1;
uchar b3:1;
uchar b2:1;
uchar b1:1;
uchar b0:1;
}BIT;
}
みたいな書き方ね。
論理演算の出来ない俺みたいな奴にとっては、
移植性が低くい << 便利
だからなw
アラインメント合わせる為にダミー入れてやったり