C言語の中のsizeofを分析する。

3628 ワード

これはコンパイルシステムに依存する値で、一般的にtypedef unsigned int size_と定義されています。t;コンパイラの林総統ですが、規格としては、char、signedchar、unsigned charのsizeofの値が1であることが保証されます。つまり、charはプログラムで使用できる最小のデータタイプです。MSDN上の解釈は、The size of keyword gives the amount of storge,in bytes,assciated with avarable or appe.This keyword returns.This keyword returns a value of type sizet.
2.文法:sizefには3つの文法形式があります。以下の通りです。1)sizeof(object)sizeof(オブジェクト)2)sizeof(type_name)///sizeof(タイプ)3)size of object///sizefオブジェクトしたがって、この3つのsizeofの使用は正しい

#include <stdio.h>
main()
{
int b;
printf("%d
",sizeof b);
printf("%d
",sizeof(b));
printf("%d
",sizeof(int));
}
4.基本的なデータタイプのsizofここの基本的なデータタイプは、shott、int、long、float、doubleのような単純な内蔵データタイプを指します。これらはすべてシステムと関連していますので、異なるシステムの下で値を取ることができます。この面では自分のプログラムの移植に迷惑をかけないようにします。一般的に、32ビットコンパイル環境では、sizeof(int)の値は4です。
5.ポインタ変数のsizeofはコンピュータ内部アドレスバスの幅に等しい。したがって、32ビットのコンピュータでは、1つのポインタ変数の戻り値は必ず4であり(注意結果はバイト単位)、将来の64ビットシステムでは、ポインタ変数のsizeof結果は8であると予想される。ポインタ変数のsizeof値は、ポインタが指すオブジェクトとは何の関係もなく、すべてのポインタ変数がメモリサイズに等しいからこそ、MFCメッセージ処理関数は、2つのパラメータWPARAM、LPARAMを使用すると、様々な複雑なメッセージ構造(構造体を指すポインタを使用して)を伝えることができる。
6.配列のsizeof配列のsizeof値は、配列が占有するメモリバイト数に等しい。例えば、char a 1[]="abc";int a 2[3]sizeof(a 1)//結果は4で、文字の末尾にはNULL終端符sizof(a 2)//が存在する。結果は3*4=12(intに依存)sizeofであり、配列要素の個数を求めるのは間違っています。配列要素の個数は以下の2つの書き方があります。int c 1=sizeof(a 1)/sizeof(char)//全体の長さ/単一の要素の長さint c 2=sizeof(a 1)/sizeof(a 1[0])//全体の長さ/最初の要素の長さ.配列名が関数パラメータとして伝達されるときにポインタとして退化することに注意します。
7.構造体のsizoff struct S 1{char c}int i;sizeofの結果は対象またはタイプが占めているメモリバイト数に等しいです。はい、S 1のメモリ割り当て状況を見てみましょう。s 1のアドレスは0 x 0012 FF 78で、そのデータの内容は以下の通りです。0012 FF 78:61 CC.FFの中間に3バイトのCCが混じっています。MSDN上の説明を見てください。When appied to astructure type or variable、size of returns the actual size、which may include padding bytement。なぜバイトの配置が必要ですか?コンピュータの構成原理を教えてくれます。そうしないと、マルチコマンドの周期がかかります。このため、コンパイラはデフォルトでは構造体を処理しています(実際には他のところのデータ変数も同じです)。幅が2の基本データタイプ(shartなど)は、2で割り切れるアドレスに配置されています。幅が4の基本データタイプ(intなど)は4で割り切れるアドレスに配置されています。これに類推します。このように、2つの数の間にパディングバイトを加える必要があるかもしれないので、全体の構造体のsizeof値は増加する。
1.sizeofは演算子であり、加減乗除の性質は同じです。コンパイルする時に実行します。運転時に実行するのではありません。もしプログラミング中にこの点を検証したら?

<SPAN style="FONT-SIZE: 18px">#include<iostream></SPAN><SPAN style="FONT-SIZE: 14px">

using namespace std;

int main()
{
    int i=1;
    cout<<i<<endl;
    sizeof(++i);
    cout<<i<<endl;
    return 1;
}</SPAN>
入力結果は1です。                  1 sizeofの++iの副作用は表示されていません。理由は一つだけあります。コンパイル時にsizefが実行された後、+iが処理されました。+iの副作用が除去されました。サイゼフが運転中に行う場合は+iに注意しなければなりません。実際にはsizeofの実現はマクロで行うべきで、マクロはコンパイル時に実行します。具体的な実現は以下の通りです。2.sizeof('a')C言語の結果は4で、C++の結果は1で、ある文章を見たことがあります。Cの中でsizeofは「数」に重きを置いていますが、C++の中でsizofは「文字」に重きを置いています。
3.マクロでsizeofを実現する二つの古典的なアプリケーション

//
#define _sizeof(T) ((size_t)((T*)0 + 1))
//
#define array_sizeof(T) ((size_t)(&T+1)-(size_t)(&T))
が、最初に2つのマクロのアプリケーションを説明するために、2つの例を挙げて説明している。sizeof(int)の結果は4です2番目の最初のステートメントのサイズは4の配列int a[4]です。では、アラリですsizeof(a)の結果は16です。非配列のマクロ定義は、まず0をT*タイプのポインタが指すアドレスに変換します。そして、Tタイプのアドレスに1を加えると、Tタイプのサイズ(すなわち、非配列Tが得られたサイズ)が加算されます。前のサイゼtアドレスをint型に変換した整数だけを返します。簡単な例として、int*p;p=p+1;------pはint*タイプのポインタであり、p+1はアドレス空間に4バイトを加算したものに相当する。配列のマクロ定義については、非配列のマクロ定義と同様であり、ここでは、配列Tをユーザー定義のタイプと見なし、&Tは配列タイプのポインタを表し、配列タイプポインタに1を加えるとアドレスに配列サイズが加算されます。ユーザーがカスタマイズしたタイプなので、0を行列タイプのアドレスに強制的に変換することはできません。1を追加したアドレスで以前のアドレスを減算するだけで得られた差は配列自体が占めるバイトサイズです。