C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 構造体のサイズ


(過去ログ 75 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■43731 / inTopicNo.1)  構造体のサイズ
  
□投稿者/ シロ (1回)-(2009/11/17(Tue) 22:17:31)

分類:[C/C++] 

2009/11/17(Tue) 22:28:39 編集(投稿者)
はじめて質問させてもらいます。
構造体のサイズについて教えてください。

環境はWindowsXP VS2008 C/C++です。

以前どこかの書籍で構造体のサイズは何もしない限りは4の倍数になる(詰め物を入れる)
と書かれていました。

試しに以下のような構造体をcout<<sizeof()にて出力してみると、16byteになりました。

struct sizesam{
  int v1;
  double v2;
};

設定などは何もしていません。
なぜ上記の構造体で16byteなのでしょうか?

int:4byte+double:8byteで12byteにならないのはなぜですか?

※追記:以下のような構造体だと12byteでした。
struct sizesam1{
  int v1,v2,v3;
};

よろしくお願いします。

引用返信 編集キー/
■43733 / inTopicNo.2)  Re[1]: 構造体のサイズ
□投稿者/ オショウ (407回)-(2009/11/17(Tue) 22:47:40)
2009/11/17(Tue) 22:50:31 編集(投稿者)

No43731 (シロ さん) に返信
> 設定などは何もしていません。
> なぜ上記の構造体で16byteなのでしょうか?

  #pragma pack
  を調べてみて下さい。

※ http://www.mm2d.net/c/c-15.shtml
  ここには親切な説明が・・・

以上。
引用返信 編集キー/
■43734 / inTopicNo.3)  Re[2]: 構造体のサイズ
□投稿者/ Hongliang (515回)-(2009/11/17(Tue) 23:02:57)
なお、
プロジェクトのプロパティ > 構成プロパティ > C/C++ > コード生成 > 構造体メンバのアラインメント
に設定があります。初期値は「既定値」のはずです。
既定値がいくつなのかは、VS のヘルプで /Zp コンパイラ オプションを調べてください。
引用返信 編集キー/
■43735 / inTopicNo.4)  Re[2]: 構造体のサイズ
□投稿者/ シロ (2回)-(2009/11/17(Tue) 23:08:56)
No43733 (オショウ さん) に返信
> 2009/11/17(Tue) 22:50:31 編集(投稿者)
>
> ■No43731 (シロ さん) に返信
>>設定などは何もしていません。
>>なぜ上記の構造体で16byteなのでしょうか?
>
>   #pragma pack
>   を調べてみて下さい。
>
> ※ http://www.mm2d.net/c/c-15.shtml
>   ここには親切な説明が・・・
>
> 以上。

質問の構造体の場合doubleの8byteがパディング(?)になって、
8の倍数の16byteになるのですね?

だからint3つの構造体では4の倍数の12と。

すっきりしました。
ありがとうございます。

※#pragma packは処理が遅くなるみたいなので避けます。
※たまにサンプルコードにのってるので参考になりました。
※#pragma packはパディングの値の設定と覚えていいですか?
引用返信 編集キー/
■43736 / inTopicNo.5)  Re[3]: 構造体のサイズ
□投稿者/ シロ (4回)-(2009/11/17(Tue) 23:29:07)
No43734 (Hongliang さん) に返信
> なお、
> プロジェクトのプロパティ > 構成プロパティ > C/C++ > コード生成 > 構造体メンバのアラインメント
> に設定があります。初期値は「既定値」のはずです。
> 既定値がいくつなのかは、VS のヘルプで /Zp コンパイラ オプションを調べてください。

/Zpのオプションを調べました。
既定値は8のようですが、これだとさきほどの追加の構造体

struct sizesam1{
  int v1,v2,v3;
};

が12byteになる理由が・・・

二つめ以降の構造体は、とあるので
この場合はintだけだから関係ないということでしょうか?

この構造体にlongなどの型を追加したときに既定値の8byte単位でつめる。
#pragma packや/Zpオプションでパディングのサイズを決める。

解釈がまちがってたら教えてください。
いちおうここで解決済みとします。

ありがとうございました。

解決済み
引用返信 編集キー/
■43739 / inTopicNo.6)  Re[4]: 構造体のサイズ
□投稿者/ .SHO (1045回)-(2009/11/18(Wed) 09:09:50)
No43736 (シロ さん) に返信

> 既定値は8のようですが、これだとさきほどの追加の構造体
>
> struct sizesam1{
> int v1,v2,v3;
> };
>
> が12byteになる理由が・・・

/Zpオプションは、必ず/Zpオプションで指定したバイト数でパディングしなさい
というオプションではないです。
パディングの必要が生じた場合のみ、/Zpオプションの影響を受けます。

ちなみに、#pragma pack も同じです。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -