埋め込まれた筆記試験の面接質問 (12 日目)


序文

この記事では、引き続き試験について紹介していきます。秋採用ももうすぐです。試験を頑張ってください。誰もが良い仕事を見つけることができると信じています。

1.SDKとは

SDKとはSoftware Development Kit(ソフトウェア開発キット)の略で、ソフトウェアアプリケーションを開発するためのツール、ライブラリ、ドキュメントの集合です。SDK は通常、ソフトウェア開発プラットフォームまたはフレームワークによって提供され、開発者がアプリケーションをより簡単かつ効率的に作成できるように設計されています。

SDK通常包含以下主要组件:

1.API (アプリケーション プログラミング インターフェイス): SDK は、一連の API、つまり、特定のプラットフォーム、オペレーティング システム、またはサービスと対話する方法を定義する一連のプログラミング インターフェイスを提供します。

2. ツールとユーティリティ: SDK は通常、コンパイラ、デバッガ、シミュレータ、テスト フレームワークなど、アプリケーションの開発、構築、デバッグ、テストのためのツールとユーティリティを提供します。

3. サンプル コードとサンプル アプリケーション: SDK は通常、開発者が API とツールを理解して使用できるように、いくつかのサンプル コードとサンプル アプリケーションを提供します。

4. ドキュメントとチュートリアル: SDK は通常、開発者が SDK のコンポーネントとツールの使用方法を理解するのに役立つ、API ドキュメント、プログラミング ガイド、開発者マニュアルなどを含む詳細なドキュメントとチュートリアルを提供します。

2. メモリ割り当ての最小単位

当涉及内存分配时,有两个相关的概念需要区分:内存分配单位和内存分配函数。

1. メモリ割り当て単位: メモリ割り当て単位は、メモリ管理の最小単位を指します。オペレーティング システムでは、通常、メモリは最小割り当て単位としてページ (Page) 単位で割り当てられます。ページ サイズは、オペレーティング システムとハードウェアによって異なりますが、通常は 4KB 以上です。

2. メモリ割り当て機能:メモリ割り当て機能は、プログラミング言語が提供する動的にメモリを割り当てる機能です。このうち、malloc 関数は C 言語や C++ 言語でよく使われるメモリ割り当て関数です。malloc 関数は、指定されたサイズの連続バイトのメモリ ブロックをプログラムに割り当てるようにオペレーティング システムに要求します。

区别:内存分配单位与内存分配函数之间的区别在于:

1. メモリ割り当て単位: オペレーティング システムおよびハードウェア レベルでのメモリ管理の最小単位を指します。通常は 4KB などのページ サイズです。オペレーティング システムは、仮想メモリなどのメカニズムをサポートするために、ページ サイズに基づいてメモリを管理および割り当てます。

2. メモリ割り当て機能: プログラミング言語が提供するインターフェースであり、プログラムの実行時にオペレーティング システムに一定サイズのメモリの割り当てを要求するために使用されます。このうち、malloc 関数は一般的なメモリ割り当て関数で、メモリ ブロックをバイト単位で動的に割り当てます。

3. メモリ割り当て関数 (malloc など) は割り当て単位としてバイトを使用しますが、オペレーティング システム レベルでは、メモリ管理は最小割り当て単位としてページを使用します。これは、オペレーティング システムがページの管理とマップを行う必要があるのに対し、アプリケーションは通常、データ構造やアルゴリズムのニーズを満たすためにメモリ割り当て関数を通じて適切なサイズのメモリ ブロックを割り当てるだけでよいためです。

3. インライン関数とマクロ関数の違い

インライン関数とマクロ関数は、プログラミングで関数拡張を実装する 2 つの方法ですが、次のようないくつかの違いがあります。

1. 構文と型の安全性:

インライン関数は、C++ 言語が提供する関数宣言方法であり、キーワード inline を使用して宣言されます。インライン関数は関数の構文構造を持ち、パラメーターの型チェックと型安全性をサポートします。インライン関数は通常の関数と同様にオーバーロードでき、複雑なステートメントや制御フローを含めることができます。
マクロ関数は、プリプロセッサがテキスト置換を実行する方法であり、マクロ定義を使用して宣言されます。マクロ関数は、関数の構文構造を持たない単純なテキスト置換であり、型チェックは実行されません。マクロ関数は展開時に単純なテキスト置換のみを実行するため、予期しない副作用が発生する可能性があります。

2. 拡張方法と基礎となる実装:

インライン関数はコンパイル中に関数展開を実行し、関数の実際のコードを呼び出し場所に埋め込むことで、関数呼び出しのオーバーヘッドを回避します。インライン関数の展開はコンパイラによって制御され、インライン化用に最適化できます。
マクロ関数は前処理の段階でテキスト置換を行い、マクロの実テキストを呼び出し元に置き換えます。マクロ関数には関数呼び出しのオーバーヘッドはありませんが、より大きなコード サイズが生成される可能性があります。

3. 名前空間とスコープ:

インライン関数は名前空間内に存在し、独自のスコープを持ちます。静的リンクを介して複数のソース ファイル間で共有できます。インライン関数はクラス内でも定義でき、クラスのメンバー関数については、クラス宣言内で直接インライン関数を定義できます。
マクロ関数には独自のスコープや名前空間はなく、単純なテキスト置換です。マクロ定義のスコープはグローバルであるため、名前の競合や予期しない副作用が発生する可能性があります。

4. デバッグとエラー メッセージ:

インライン関数はコンパイラ処理の一部であるため、デバッグ中にシングルステップで実行して観察することができ、より適切なデバッグ情報とエラー プロンプトを提供できます。
マクロ関数は単なるテキストの置換であるため、マクロ関数を 1 回の手順で実行して観察することはできません。そのため、デバッグやエラーの特定が困難になる可能性があります。

总的来说,内联函数比宏函数更安全、更灵活,可以进行类型检查,有自己的作用域和命名空间,提供更好的调试和错误信息。而宏函数则更接近于简单的文本替换,没有类型检查和作用域的概念,可能会产生不可预期的副作用。因此,推荐在C++中使用内联函数,除非特殊情况下需要使用宏函数的特性和灵活性。

4. NULL ポインタとワイルド ポインタの違い

1. ヌルポインタ:

null ポインターは、ポインターが有効なオブジェクトまたは関数を指していないことを意味します。C および C++ では、NULL ポインターは通常、特殊な値 0 で表されるか、マクロ NULL または C++11 で導入された nullptr キーワードを使用して定義できます。
NULL ポインタが指すものは、NULL ポインタを表す目的で予約されている既知の特別なアドレスです。NULL ポインタを逆参照すると (ポインタが指すメモリにアクセスするなど)、未定義の動作が発生します。

2.ダングリングポインタ:

ワイルド ポインタは、無効な未定義のメモリ アドレスを保持するポインタ変数を指します。ワイルド ポインタは、解放されたメモリ アドレスである場合もあれば、有効なオブジェクトにまだ割り当てられていないメモリ領域を指している場合もあります。
ワイルド ポインターは、プログラムのクラッシュ、メモリ エラー、予期しない動作を引き起こす可能性がある危険なプログラミング エラーです。

5. ワイルド ポインターと null ポインターにアクセスするとどうなるか

访问野指针:

プログラムがクラッシュまたは異常終了する可能性があります。
予測できないデータまたは無効なデータが読み取られ、予期しない結果が生じる可能性があります。
情報漏洩やバッファオーバーフローなどのセキュリティ上の脆弱性を引き起こす可能性があります。

访问空指针:

セグメンテーション違反 (Segmentation Fault) やヌルポインタ例外が発生し、プログラムが終了する場合があります。
未定義の動作が発生し、プログラムの動作が予測不能になる可能性があります。

6、C++ オブジェクト指向の 3 つの要素

1. カプセル化:

カプセル化は、データと操作をバンドルしてクラスを作成するメカニズムです。クラスはデータ (メンバー変数) と操作 (メンバー関数) を組み合わせて、実装の詳細を隠し、外部使用に必要なインターフェイスのみを公開します。
カプセル化は、アクセス制御 (パブリック、プライベート、保護) を通じてデータ保護を提供するため、データはクラスのインターフェイスを通じてのみアクセスおよび変更できます。
カプセル化により、情報の隠蔽とデータの分離が実現し、コードの保守性、柔軟性、セキュリティが向上します。

2. 継承:

継承は、クラス (サブクラスまたは派生クラスと呼ばれる) が別のクラス (親クラスまたは基本クラスと呼ばれる) に基づいて、親クラスの属性と動作を継承できるようにするメカニズムです。
継承を通じて、サブクラスは親クラスのコードを再利用し、コードの重複を避け、親クラスの動作を拡張または変更できます。
継承は、「is-a」関係などのクラス間の関係を実装し、サブクラスを親クラスのタイプとみなすことができます。

3. 多態性:

ポリモーフィズムとは、基本クラス (親クラス) からのポインターまたは参照を使用して派生クラス (サブクラス) オブジェクトを参照し、コンテキストに基づいて実行する適切なメソッドを自動的に選択する機能を指します。
ポリモーフィズムを使用すると、基本クラスの仮想関数をオーバーライド (オーバーライド) して特定のクラスの動作を実現することにより、同じインターフェイスを使用して異なるオブジェクトを処理できるようになります。
ポリモーフィズムによりコードのスケーラビリティと柔軟性が向上し、プログラムがさまざまなオブジェクト タイプに基づいて適切なアクションを実行できるようになります。

7. if(0 == x) と if(x == 0)

一般的に、多くの人は if(x == 0) を使用することに慣れていますが、if(0 == x) を使用する人もいます。if(0 == x) を使用すると、== が = と誤って記述されることがなくなります。エラー。

8. 2次元配列のアドレスは連続していますか?

2 次元配列のアドレスはメモリ内で連続しています。2 次元配列は、その要素を行優先の順序でメモリに連続的に格納します。

int arr[3][4];

メモリ内では、次のように継続的に保存されます。

arr[0][0]   arr[0][1]   arr[0][2]   arr[0][3]   arr[1][0]   arr[1][1]   arr[1][2]   arr[1][3]   arr[2][0]   arr[2][1]   arr[2][2]   arr[2][3]

したがって、2 次元配列のアドレスは連続しており、ポインター算術演算を通じて配列内の要素にアクセスできます。

たとえば、ポインタを使用して 2 次元配列内の要素にアクセスできます。

int arr[3][4] = {
    
    {
    
    1, 2, 3, 4}, {
    
    5, 6, 7, 8}, {
    
    9, 10, 11, 12}};
int *ptr = &arr[0][0];

for (int i = 0; i < 12; i++) {
    
    
    printf("%d ", *(ptr + i));
}

上記のコードは、継続的に保存された 2 次元配列の要素値を出力します。

1 2 3 4 5 6 7 8 9 10 11 12

したがって、連続的に割り当てられた 2 次元配列の場合、そのアドレスは連続しており、ポインター算術演算を通じて 2 次元配列の要素にアクセスして操作できます。

要約する

この記事ではここで説明します。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/132395760
おすすめ