質問するログイン新規登録

質問編集履歴

3

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

title CHANGED
File without changes
body CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  [メンバの順序](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)
60
60
 
61
- いろいろ出てきますが、詰め物の最小化とメンバ変数の順序には関係性がありそうです。
61
+ いろいろ出てきますが、**詰め物の最小化とメンバ変数の順序には関係性がありそうです。**
62
62
  maismakunさんやケイロニアンさんの回答をもとにすると、CPUとメモリ、メモリと記憶装置、の両方とも理想的な構造体を作成するのは、難しいと思われます
63
63
 
64
64
  64bit CPUに話を絞るのですが、8^2なので、実行単位は8byteだと思います。

2

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

title CHANGED
File without changes
body CHANGED
@@ -42,7 +42,8 @@
42
42
 
43
43
  一応windows 64bitで実験しました。
44
44
 
45
- [追記]
45
+ > [追記]
46
+
46
47
  Linux 64 bit でもっとメンバ変数を多くして実験してみたところ、
47
48
  double, float, int, short, unsigned char, char
48
49
  の順に下から大きい順に並べて構造体を作成してみたところ、gccコンパイラでのoffsetofの結果は、詰め物バイト数を最小にすることができました。
@@ -51,4 +52,15 @@
51
52
  どうしても、詰め物を入れざるを得ない状況(メンバ変数の全バイトが倍数にならない)で、詰め物を0byteにするのは実質、不可能なんでしょうか?
52
53
 
53
54
  例えば、詰め物を0byteに出来るように、あえて使わないメンバ変数を作成し、0で初期化した場合、それをバイナリファイルへの出力としたら、中間に余計な0が入ってしまいます。
54
- これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?
55
+ これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?
56
+
57
+ > [追記2]
58
+
59
+ [メンバの順序](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)
60
+
61
+ いろいろ出てきますが、詰め物の最小化とメンバ変数の順序には関係性がありまそうです。
62
+ maismakunさんやケイロニアンさんの回答をもとにすると、CPUとメモリ、メモリと記憶装置、の両方とも理想的な構造体を作成するのは、難しいと思われます
63
+
64
+ 64bit CPUに話を絞るのですが、8^2なので、実行単位は8byteだと思います。
65
+ 構造体全体のサイズを8の倍数にし、さらに詰め物を最小にするような構造体の作成はやや大変だと思います。
66
+ メンバ変数の順序以外に理想形に近づける方法は他にありますでしょうか?

1

追記

2017/05/09 14:34

投稿

strike1217
strike1217

スコア651

title CHANGED
File without changes
body CHANGED
@@ -40,4 +40,15 @@
40
40
 
41
41
  構造体を作るときにいちいちoffsetofマクロでアライメントを確認するのが、非常に大変な作業なので、構造体を作るときにメンバ宣言のルールのようなものがありましたら、教えてください。
42
42
 
43
- 一応windows 64bitで実験しました。
43
+ 一応windows 64bitで実験しました。
44
+
45
+ [追記]
46
+ Linux 64 bit でもっとメンバ変数を多くして実験してみたところ、
47
+ double, float, int, short, unsigned char, char
48
+ の順に下から大きい順に並べて構造体を作成してみたところ、gccコンパイラでのoffsetofの結果は、詰め物バイト数を最小にすることができました。
49
+ 大きいバイト数から数えて(下から)、最大のバイト数の倍数(この場合、double型の8の倍数)になるように構造体の各メンバ変数を作成、調整をしていけば良さそうです。
50
+
51
+ どうしても、詰め物を入れざるを得ない状況(メンバ変数の全バイトが倍数にならない)で、詰め物を0byteにするのは実質、不可能なんでしょうか?
52
+
53
+ 例えば、詰め物を0byteに出来るように、あえて使わないメンバ変数を作成し、0で初期化した場合、それをバイナリファイルへの出力としたら、中間に余計な0が入ってしまいます。
54
+ これでは、ダミー変数を用意しても詰め物と同じ結果になりませんか?