質問編集履歴
3
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -118,7 +118,7 @@
|
|
118
118
|
|
119
119
|
|
120
120
|
|
121
|
-
いろいろ出てきますが、詰め物の最小化とメンバ変数の順序には関係性があり
|
121
|
+
いろいろ出てきますが、**詰め物の最小化とメンバ変数の順序には関係性がありそうです。**
|
122
122
|
|
123
123
|
maismakunさんやケイロニアンさんの回答をもとにすると、CPUとメモリ、メモリと記憶装置、の両方とも理想的な構造体を作成するのは、難しいと思われます
|
124
124
|
|
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -86,7 +86,9 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
[追記]
|
89
|
+
> [追記]
|
90
|
+
|
91
|
+
|
90
92
|
|
91
93
|
Linux 64 bit でもっとメンバ変数を多くして実験してみたところ、
|
92
94
|
|
@@ -105,3 +107,25 @@
|
|
105
107
|
例えば、詰め物を0byteに出来るように、あえて使わないメンバ変数を作成し、0で初期化した場合、それをバイナリファイルへの出力としたら、中間に余計な0が入ってしまいます。
|
106
108
|
|
107
109
|
これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
> [追記2]
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
[メンバの順序](http://www.google.co.jp/search?sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-34,GGGL:ja&q=%22%E6%A7%8B%E9%80%A0%E4%BD%93%22+%22%E3%83%A1%E3%83%B3%E3%83%90%E3%81%AE%E9%A0%86%E5%BA%8F%22+%22%EF%BC%A3%E8%A8%80%E8%AA%9E%22)
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
いろいろ出てきますが、詰め物の最小化とメンバ変数の順序には関係性がありまそうです。
|
122
|
+
|
123
|
+
maismakunさんやケイロニアンさんの回答をもとにすると、CPUとメモリ、メモリと記憶装置、の両方とも理想的な構造体を作成するのは、難しいと思われます
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
64bit CPUに話を絞るのですが、8^2なので、実行単位は8byteだと思います。
|
128
|
+
|
129
|
+
構造体全体のサイズを8の倍数にし、さらに詰め物を最小にするような構造体の作成はやや大変だと思います。
|
130
|
+
|
131
|
+
メンバ変数の順序以外に理想形に近づける方法は他にありますでしょうか?
|
1
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -83,3 +83,25 @@
|
|
83
83
|
|
84
84
|
|
85
85
|
一応windows 64bitで実験しました。
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
[追記]
|
90
|
+
|
91
|
+
Linux 64 bit でもっとメンバ変数を多くして実験してみたところ、
|
92
|
+
|
93
|
+
double, float, int, short, unsigned char, char
|
94
|
+
|
95
|
+
の順に下から大きい順に並べて構造体を作成してみたところ、gccコンパイラでのoffsetofの結果は、詰め物バイト数を最小にすることができました。
|
96
|
+
|
97
|
+
大きいバイト数から数えて(下から)、最大のバイト数の倍数(この場合、double型の8の倍数)になるように構造体の各メンバ変数を作成、調整をしていけば良さそうです。
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
どうしても、詰め物を入れざるを得ない状況(メンバ変数の全バイトが倍数にならない)で、詰め物を0byteにするのは実質、不可能なんでしょうか?
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
例えば、詰め物を0byteに出来るように、あえて使わないメンバ変数を作成し、0で初期化した場合、それをバイナリファイルへの出力としたら、中間に余計な0が入ってしまいます。
|
106
|
+
|
107
|
+
これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?
|