質問編集履歴

3

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

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

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

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

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

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
+ これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?