sizeof 2007-12-19 11時06の使い方

sizeofの役割は何ですか?sizeofオペレータ(演算子)C / C ++は、単に、機能の数がオブジェクト型またはバイトによって占有されるメモリを返すことで、です。その戻りsize_t型は、ヘッダファイルSTDDEF.Hで定義されています。これは、値、ビルドシステムに依存し、一般的に次のように定義されますunsigned int型のsize_t型のtypedef。

       使用法:

      (A)はsizeof評価するための発現、コンパイラは式の種類に応じて、最終結果のサイズを決定し、発現は、一般的にはありません
計算します。例えば:
はsizeof(2); // 2型INTため、それはsizeof(INT)と等価である;
はsizeof(2 + 3.14); 3.14 //型は二重である、2はそうのような二重型に解除しますsizeof(ダブル)と同等であり、
はsizeofはまた、関数呼び出しのために評価することができ、関数は型のサイズの結果を返しますが、関数が呼び出されることはありません
、我々は完全な例を見て、:
int型のfoo()
{
のprintf( " 。;呼び出さfooが()) "\ N-がされた
2を返す;
}
int型のmain()
{
SZにはsizeof(FOO(= SIZE_T));チャーの//のfoo()戻り値の型を、そうSZ =はsizeof(CHAR) 、FOO()が呼び出されていないと
のprintf( "はsizeof(FOO())D =%\ N-"、SZ);
}
C99規格、関数、式およびビット・フィールドの種類を判別することができない(ビットフィールド)部材Sを算出することができない
、すなわち、以下の実施例は偽で、値izeofを:
のsizeof(FOO); //エラー
ボイドfoo2は(){}
はsizeof(foo2は()); //エラー
構造体S
{
INT :. 1 F1の符号なし;
unsigned int型F2 :. 5;
unsigned int型F3:12であり;
};
のsizeof(S.f1); //エラー
CONST(II)はsizeof
それが可能な場合、算出はsizeofは、コンパイル時に発生などのように一定の表現、使用:
進char型[はsizeof(int)を* 10]; // OK
のsizeofは、次の手順のDev-C ++(私は4.9であるとして、実行時にC99最新の標準を計算することができます。 9.2)ことができる
正しく行わ:
INT N-;
N- = 10; // N-動的割り当て
チャー進[N]; // C99はまた、ダイナミックアレイ定義サポート
のprintf( "%Dを\ n" 、はsizeof(進))を; / / [OK]をクリックします。10の出力
が、完全に標準C99コンパイラでは実現されないが動作しません、上記のコードはVC6をコンパイルしません。だから、私たちはより良いのsizeofはコンパイル時に行われるので、エラーを導入していない、より強力なプログラムの移植ように思うだろう。

sizeof(C)ポインタ変数
ポインタアドレスは、他のオブジェクトに格納されています。それはアドレスを格納することであるので、それはもちろん、コンピュータの内部アドレスバスの幅に等しいです。したがって、32ビットコンピュータでは、戻り値に関わらずタイプのポインタ変数マスト4(バイト単位で結果を注意してください)、です。

(IV)はsizeofアレイ
などのアレイによって占められるメモリのバイト数に等しい値、のはsizeof配列:
A1 [] = "ABC"をchar型、
INT A2; [3]
のsizeof(A1); //結果、4つの文字の終わりを\ 0ターミネータもあり
はsizeof(a2は); //結果は3 * 4 = 12である(int型に依存)
初心者は、配列要素の数としてはsizeofを模索し始めた、そして今、あなたはそれが適切ではないことを知っている必要があり、その後、我々はそれの配列の要素数を求めるべきか?:両方のバージョンは、典型的には、以下有する
INT = C1はsizeof(A1)/はsizeof(文字)を、個々の要素の合計長さ/長さの//

ここに書く、質問、以下のC3を入れて、あるべきどのくらいの値C4
のボイドfoo3(A3チャー[3])
{
int型C3 =はsizeof(A3); // C3の==
}
無効foo4(A4はchar [])
{
int型C4 =はsizeof(A4); // == C4
}
あなたが答えることをしようとしているとき多分はい、C3 = 3、すでにC4 C3は間違った値を認識しています!ここでは、関数foo1のを呼び出すときに、理解することは難しいことではありません、プログラムは3の配列としてスタック上のサイズを割り当てますもはや機能パラメータA3の配列型はありませんが、それについて考えるのはなぜ同等のchar * a3と、あるポインタに変換あなたはしません!アレイは、「パス・バイ」、発信者は、単に、過去の引数のアドレスを渡すポインタ型(チャー*)ようにA3性質、それがC3の値である
4。あなたが異常な場所を与えるために。次のように:

CHAR CH [] = "テスト"。

sizoef(CH)==?どのくらい?5間違いなくそれを

CH [4] = 1。

CH [5] = 2;

CH [6] = 3;

sizoef(CH)==?それはどのくらいですか?

結果は5だった、となぜですか?まず、オブジェクト必要はsizeofの数や種類は、メモリのバイトを占有されています。第二に、ときクロスボーダーセクションや配列の配列は、それを境界とした後?これからは違い、char型のCH *に相当します。したがって、はsizeof(CH)は、代わりにサイズCH CHはポインタの部分を含む配列によって占有必要なメモリのサイズです。

sizeof(5)の構造は、
私たちは構造を見てみましょう:
構造体S1
{
char型のCを、
私がint;
};
どのくらいのsizeofを依頼する(S1)、それに等しいのですか?、1つのバイトをchar型4つのバイトをint型、それは5まで追加する必要があります。それはあなたが正しいかもしれないあなたのマシン上でそれを試してみましたが、最も可能性の高いあなたは間違っているというのは本当です!8にデフォルト設定で得られた結果VC6。なぜ?:さて、メモリ割り当てS1を見てみましょう、のは、オブジェクトまたはの種類によって占められるメモリのバイト数に等しいのsizeofを考え--sizeof定義の結果を見てみましょう
S1、S1 = {「A」を、 0xFFFFFFFFを};
どこS1メモリを観察し、ブレークポイント、dubugの試運転で、後に変数上で定義された、あなたは何を発見しましたか?次のように私のVC6.0では、例えば、S1アドレスは0x0012FF78、そのデータを次のとおりです。
0012FF78:61 CC CC CC FF FF FF FF
ああ、これは伝説的なバイトアラインメントです!重要なトピックが登場しました。なぜ我々は、バイトアラインメントコンピュータ構成原理が必要なのか、これはあなたのコンピュータのアクセス速度を高速化するのに役立ちます、または命令サイクルの多くを過ごすためにことを私たちに教えています。この目的のために、コンパイラは、(あまりにも、他の場所で実際に可変データ)処理構造をデフォルトするように2で割り切れる2つのアドレスに配置されている基本データ型(ショートなど)の幅は、そのSO 4の幅基本データ型(INTなど)が4で割り切れるなどのアドレスに配置することができます。全体の構造が増加するための値はsizeofこれにより、それは、スタッフィングバイトを追加する二つの中間数を必要とするかもしれません。
:S1、スワップINTチャーと位置を聞かせて
構造体S2は、
{
I int型、
チャーCを;
};
結果は見てのsizeof(S2)は、メンバーがまだああ、法の次の要約を心配しないでください理由である、元のC 3パディングバイトを持った後、その後、メモリを見てどのまたは8と、どのくらいです。バイトは、コンパイラの実装の詳細と関連する整列一般的に、3つの基準を満たすために:
1)最初のアドレスの可変構造は、メンバーの最も広いサイズの基本的なタイプ分割することができ、
各メンバー2)構造に対してオフセット最初のアドレス構造(オフセット)部材のサイズの倍数である、必要な場合、コンパイラは、メンバー間パディング(追加内部)を追加し、
合計サイズ3)
上記のガイドラインについては、いくつかのポイントがあります注意する必要があります。
1)構造体のアドレスは、メンバーの前で言っているのではないそのサイズの整数倍である、追加、それを相殺する方法ためのポイント1の存在を、私たちはできるだけでオフセットのメンバーを考慮し、このような考え方は単純です。なぜ考えてみて?最初のアドレスオフセット構造体の構造体のメンバは、offsetofは()によってマクロに関して得ることができる、マクロSTDDEF.Hはまた、次のように定義される:
((offsetofは(S、M)は(size_t)とを#defineします(S *)0) - > M)
、たとえば、オフセットS2、C、メソッド取得したい
size_t型のPOSを= offsetofは(S2は、C ); // POSは4に等しい
2)は、前述の基本的なタイプを指し以下のような文字、ショート、整数、フロート、内蔵用語「データ幅」は、そののsizeofの大きさを意味するような二重のようなデータ型。メンバーの構造は、他の構造のような複合型、ので、メンバーの最も広い基本的なタイプの検索をすることができるので、メンバーは、複合体のサブタイプではなく、全体としての複合体を含むべきです。しかし、オフセット位置を決定する際に複合型部材を吸引
複合型の総合的な視点として。ここでは(特定の値まだのは、それの例を見てみましょう、に対処するために少し難しいことを考えて、発音には少し難しいの物語
VC6は、例えば、もはや説明されません):
構造体S3
{
char型のC1、
S1 S;
char型C2
};
S1のほとんど最も広いメンバーを考えるとき、S3は、最初のアドレス空間を格納する変数によって定義されたように、ワイドタイプのメンバーは、単純なint型、S3は、最も広いS3は、単純なint型で、見て「解体」シンプルタイプS1です4で割り切れることが必要であり、全体のsizeof(S3)の値も4で割り切れるであるべきです。オフセットC1構造は、そのサイズが8であるので、上記3つの基準は、また、可変で満たすようにシフト量sの場合は、それが全体の間にオフセットされ、0である。4、C1およびs図3は、端を補う必要がありますように、13は、4で割り切れないが、オフセット12 C2となるようにC2のサイズ数は13であり、必要とされない、とC2との間のパディングバイトを必要とするであろう3パディングバイト。最終的に得られるのsizeof(S3)は、16です。
オフセットプラスサイズの最後のメンバープラスすなわち端にパディングバイトの数に等しいサイズの構造:上記の説明を通じて、我々は以下の式を得ることができます。

sizeof(構造体)= offsetofは(最後の項目)+(TRはsizeof(最後の項目)+はsizeof
病んパディング)

ここでは、私の友人は、新しい理解と構造はsizeofなければならないが、あまりにも興奮していない、そこにはsizeofに影響を与える重要なパラメータで言及されていないで、それはパック命令コンパイラです。構造の配向を調整するために使用され、そして異なるコンパイラはの#pragmaパックVC6によって達成わずかに異なる名前を使用し、直接/ Zpのコンパイラスイッチを変更することも可能です。基本的な使用方法をパックの#pragmaである:の#pragmaパック(n)は、nはこの構造体のsizeofの値未満である場合に値1,2,4,8,16でバイト整列の数、デフォルトは、8であります小さい場合、部材は、このオフセット値をとるべきであり、取得され、オフセット構造部材は、両方の最小値であるべきである
以下の式:
offsetofは(項目)=分(N、はsizeof(項目))
の例を見て:
の#pragmaパック(プッシュ)//現在のパックに設けられたプッシュ保存
の#pragmaパックの構造が定義される前に、(2)//を使用しなければならない
構造体SLの
{
チャーC;
int型私は;
};
構造体S3
{
C1チャー;
S1をS;
チャーC2
}。
#pragmaパック(POP)//パックの前計算を復元が提供さはsizeof(S1)、分(2 、はsizeof(I)) 2では、iが2であるオフセット、プラスのsizeof(i)は、に等しいです。図6に示すように、2で割ったので、全体S1のサイズが6であることができます。同様に、はsizeof(S3)のために、変位sは2であり、C2は8であるオフセット、プラス9に等しいのsizeof(C2)は、パディングバイトを追加して、2で除算することができない、はsizeof(S3)は、に等しいです。 10。さて、友人が簡単に息を切らしたり、「空の構造」(ノーデータメンバ)の大きさがゼロではないですが、1ということに注意することも重要です。「何のスペースは、」コンパイラだけになるように、変数、二つの異なる「空の構造体」変数とどのようにそれを区別するためには、「空の構造」変数は、保存する必要がどのように対処するために取られない想像占有バイトのためのスペースを割り当てます。次のように
構造体{S5};
はsizeof(S5)を; //結果は1であります

ビットフィールド構造を含むのsizeof(VI)は
、すでに言われてきた、単一ビットフィールドメンバではありませんが議論するために、ここで、はsizeof値を取られるだけで、アカウントにその特別な特殊性を取るビットフィールドを含むのsizeof構造であり、記載されています。C99は、bool型としてのint、unsigned int型、およびビットフィールドを予め定められたが、これはほぼすべてのコンパイラは、拡張された
タイプの他のタイプの存在を許します。ビットフィールドメモリを使用する主な目的は、一般規則れ、圧縮されている:
1)はsizeof型サイズの合計よりも少なく隣接するビットフィールドの同じタイプフィールド、およびビット幅の場合、フィールドのバック直ちにフィールドメモリの前に、これまで受信していないまで、
隣接するビットフィールドの同じタイプフィールドが、ビット幅はsizeof型サイズの合計よりも大きい場合2)、カラムのバックは、新しい記憶装置、それらのサイズをオフセット整数型を開始します回;
3)各コンパイラの違いの特定の実装とは異なるタイプフィールド隣接するビットフィールド、VC6を取る圧縮なし、のDev-C ++場合取ら圧縮、
フィールドが非ビットである場合4)ビットフィールドの間に挿入ドメインフィールドは圧縮されていません。

5)サイズの整数倍の最も広いメンバーの基本的なタイプの構造全体の合計サイズ。

私たちは例を見てみましょう。
実施例1:
構造体BF1
{
チャーF1 :. 3;
CHAR F2 :. 4;
CHAR F3 :. 5;
};
そのメモリレイアウト:
| _f1__ | __f2__ | _ | ____ F3 ___ | ____ |
| _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ |
0 3 8 7 1316
チャーのビットフィールドタイプ、最初のバイトは、F1とF2を収容することができ、f2がそれほど圧縮されています最初のバイトに、そしてF3は次のバイトで開始することができます。(BF1)こうしてはsizeofの結果は2です。
実施例2:
構造体BF2
{
チャーF1 :. 3;
ショートF2 :. 4;
CHAR F3 :. 5;
};
異なる隣接するビットフィールドタイプでVC6にはsizeof 6、のDev-C ++では2です。
実施例3:
BF3の構造体
{
チャーF1:3
チャーF2;
チャーF3 :. 5;
};
のDev-C ++で得られたフィールドが挿入された非ビット・フィールド、圧縮が発生していない、とVC6 3の大きさです。

おすすめ

転載: www.cnblogs.com/lu-ping-yin/p/10988690.html