1:クラスについて少し説明
空のクラスのサイズ
空のクラスは、コンパイラしばしば暗黙のバイトとNULLクラスに、メモリ内の各インスタンスは、固有のアドレスを持っていることを確実にするためにインスタンス化することができるので、C ++クラスのサイズは、中空です。
第二に、クラスのメンバ関数と非仮想メンバ関数
クラス非仮想メンバ関数は、空間を占有しない、仮想関数テーブルがあれば、仮想関数(関係なく数の)が唯一の4つのバイトを占有するように、4つのバイトを占有します。メンバ関数または同じ一般的な機能に存在します。楽しい(a.this)によってa.fun()が呼び出されます。名前には、いわゆるメンバ関数のみのクラスです。実際には、クラス共有機能コードのオブジェクトの数と、クラスのメンバ関数ではないオブジェクトのサイズ。そして、私たちは、クラスのメンバ関数を訪れ、クラス内のポインタによって実装され、これはテーブルへのポインタ、(もちろん、異なるコンパイラは、わずかに異なる実装を有していてもよい)を記録、各メンバ関数テーブルのアドレスです。だから我々は、メンバ関数は、間接的にアドレスでアクセスしてください。これは、我々はいくつかの短い、高コール頻度関数が宣言されたインラインフォーム(インライン関数)を入れ提唱する理由である一定の時間、コストが増加します。
第三に、基底クラスと派生クラス
派生クラスのすべてのメンバーは、派生クラスのサイズは、独自のデータメンバーにスペースを追加するために、基本クラスのサイズに基づいており、(プライベートデータメンバーを含む)の基本クラスを継承しています。
第四に、クラスのデータメンバを持つ仮想テーブル
最初のメモリに仮想関数テーブル、その後、データメンバ。
第五に、クラス構造
方式のアライメント規則および構造基本的に同じである、すなわち、それ自身のメンバーコンパイラの数とデータを取得することは、実際の位置合わせの小さな数との間のアラインメントのデフォルト数を取ります。
第六に、クラスのデータメンバ
自分の記憶に参加するには、クラスの宣言順のデータメンバー、(そのアクセス権とは何の関係、つまり、パブリック、プライベート、保護されたデータメンバーかどうかは、宣言順に見て)
七、クラスの静的データメンバは、スペースを取りません、それはまた、その派生クラスの真のです。
2:二次元アレイ
INT [2] [3] = {{1,2,3}、{4,5,6}}、
{} {}次に、各行の内部を分離において、第一の対{} 1,2,3初期値は行の三つの要素の初期値は0です。初期値{4,5,6}が行の2番目の要素3の初期値です。次のステートメント実行に相当する
:[3] INT A [2]、
[0] [0] = 1; [0] = 2; [0] [2] = 3; [1] [[1]。 0] = 4 [1 ] [1] = 5; [1] [2] = 6、
データの初期化の数は、配列要素、またはエラーの数を超えることができないことに注意してください。
⑵分岐初期化しない
INTを[2] [3] = {1,2,3,4,5,6}、
データ{}は各素子列(行割当)に割り当てられたシーケンスです。すなわち、[0] [0] = 1; [0] [2] = 3; [1] [0] = 4 [1] [1] = 5 [0] [1] 2 = [1] [2] = 6;
⑶アレイの一部が初期化されている
[2] [3 INT静的 ] = {{1,2}、{4}};
最初の2行のみ初期値、順序それぞれに割り当てられた[0] [0] [0] [1]、第4行目の初期値が割り当てられている[1] [0]。初期値は0、他の配列要素になるようにメモリタイプは、静的であるからです。注:一部のC言語のシステム(例:ターボC)、スタティックメモリタイプの変数や配列の初期値は0ではありません。
[2] [3 INT静的 ;] = {1,2}
の2つのだけの初期値、すなわち、[0] [0] = 1、[0] [1] = 2、 残りの配列要素の初期値であります0。
⑷最初のディメンションを定義省略してもよいが、第二の次元を定義省略することができません。システムは、長さと第二次元におけるデータの初期化の数に応じて第一の次元の長さを決定することができます。
INT [] [3] = {1,2,3,4,5,6}、
アレイの次元の最初の定義、すなわち、行ごと、3は二次元の長さであり、6の初期化データを省略しています数3は、第一のアレイは2次元です。
典型的には、最初の次元は、省略定義され、以下のように最初の次元のサイズが決定される
数の初期値が第2の寸法によって分割することができ、最初の次元の大きさの商である。割り切れない場合は、最初の次元1プラスビジネスのサイズ。例えば、[] [3] INT ; = {1,2,3,4} [3 [2] INT:に相当し ;] = {1,2,3,4}
の初期化分岐は、省略することができる場合これは、最初の次元を定義しました。{}次の2つのペアで定義されたアレイは、アレイは、2つの行を有する表します。
INT静的[] [3] = {{1,2}、{4}}。
1
2
3
|
int p = - 1 ;
int y = 0 ;
y = p++ + ++P;
|
1
2
3
4
5
6
7
8
9
10
|
subl $ 40 , %esp ; 分配 40 字节
movl $ 1 , - 16 (%ebp) ; 存储 p
movl $ 0 , - 12 (%ebp) ; 存储 y
movl - 16 (%ebp), %eax ; 这 3 步执行 p++
leal 1 (%eax), %edx
movl %edx, - 16 (%ebp)
addl $ 1 , - 16 (%ebp) ; 这 2 步执行 ++p
movl - 16 (%ebp), %edx
addl %eax, %edx ; 相加操作
movl %edx, - 12 (%ebp) ; 结果写回 y
|
5:いくつかの一般的な呼び出し規約:
問題分析:この質問は、呼び出し規約のサポート可変長引数としてprintfのような関数を選択するよう求めました。
1.呼び出し規約の機能は何ですか?
:関数が呼び出されると、関数の戻り値は呼び出し元の関数に返されながら、関数のパラメータは、呼び出される関数に渡されます。パラメータ(戻り値)の機能を記述するために使用される規則をされた呼び出しに送信され、どのように、誰バランススタックによって。
2.共通機能の呼び出し規約何?
答:__ stdcall規約、__ cdecl規約、__ fastcall、__ thiscall、__ nakedcall、__パスカル
これらの規則のパラメータに従って配信順序を分けることができる:
A)左に:. __ _stdcall右からスタック、CDECL __、__ thiscall
B)スタック__、__右:.パスカル左fastcallから
3.機能可変長何をサポートするための呼び出し規約?
:可変長引数を持つ__ cdecl規約、関数がcdecl呼び出し規約でなければならない、関数の呼び出し元は、右から左にスタックにパラメータのスタック順序をクリアします
6:メモリ操作機能説明複数の