質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2316閲覧

構造体のバイト数について

dokodoko486

総合スコア25

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/08/27 12:54

C

1struct cell { 2int value; 3struct cell* next; 4 }; 5printf("%d¥n",sizeof(struct cell)); 6printf("%d¥n",sizeof(struct cell *));

上のような線形リストの構造体cellがあるとします。出力結果が、16,8となったのですが、なぜそうなるのかよく分かりません。intのバイト数が4というのは分かるのですが、cell*のバイト数が8となるのが分かりません。また、このように考えると。構造体cellのバイト数は4+8=12となると思うのですが、なぜ16になるのか分かりません。教えて下さい。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

まず、ポインタのサイズは中身とは関係なく、マシンアーキテクチャによって決まります。WindowsやLinuxの64ビット環境では、ポインタも64ビット=8バイトです。

そして、構造体全体のサイズは、アライメントといって隙間が入っていることがあるので、中身のサイズの和とは必ずしも一致しません。

投稿2018/08/27 12:57

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

構造体の中身のメンバーを隙間なく詰めるか、隙間を空けて、8バイト変数を8の倍数番地に置くなどするかは、メモリの節約と変数のアクセス速度とのトレードオフです。

struct cellの場合、隙間なく詰めると、8バイトサイズのnextが8の倍数番地に置かれないことがありますが、その場合、そのnextへのメモリアクセスがごく僅かですか遅くなります。
つまり、8バイト変数は、8の倍数番地に置くとアクセスが速いのです(x86やx64だと速度だけの問題ですが、CPUに依っては8の倍数番地で無いと1命令で8バイトアクセス出来ないものもあるかもしれません)。

ソースコードの構造体定義の前に#pragma pack(1)とか書くと、構造体メンバー間の隙間を詰めますので、struct cellは12バイトになります。

投稿2018/08/27 16:01

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構造体cellのバイト数は4+8=12となると思うのですが、

多分、64bitアライメントで、64bitの倍数に切り上げでしょう。
12/8 => 1.5 切り上げで、2 ... 2x64bit / 8bit => 16

投稿2018/08/27 13:02

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

アライメントのせいです。

構造体のサイズとアライメント

投稿2018/08/27 12:57

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問