2

SOの周りを少し検索してみましたが、この質問に対する答えが見つかりません。おそらく私はそれを適切な言葉で表現することができないからです。私が知りたいのは、関数がメモリ内でどのように表現されているかです。命令にはいくつかのストレージ要件が必要であり、関数ポインタを使用してメモリ内のそれらの場所をキャプチャできます...誰かがこれについて詳しく説明できますか?

最も一般的な概念である特定の実装は重要ではありません。そして、なぜsizeofが関数に適用されないのですか?私はこれについて本当に興味があります、私の概念が最初から欠陥があるならば(言い換えれば、私がそれについて間違った方法で考えているならば)私は謝罪します。

4

1 に答える 1

3

言語によって異なります。コンパイル型言語の場合、関数はメモリ内で機械語として表されます。通常、広く使用されているプロセッサのドキュメントは、製造元から入手できます。

C / C ++の場合、関数ポインターは、関数へのエントリポイントのアドレスと同じくらい単純にすることができ、単一の命令で直接呼び出すことができます。これはC/C ++の実装では一般的だと思いますが、仕様はそれを保証するものではありません。一般に、関数ポインターのタイプによって、関数の呼び出し規約が決まります。つまり、関数が検出することを期待する引数と、その結果を返す方法です。

関数の実際のコードサイズは、関数の呼び出しとは関係ありません。関数ではsizeof(my_function_pointer)なく、関数ポインターのサイズを示します。生の関数アドレスでさえ、データポインタとは異なる方法で表現される場合があることに注意してください(qv、初期のWintelセグメント化アーキテクチャを対象とするコンパイラ、またはコードとデータのアドレス空間が完全に異なる組み込みプロセッサ)。

(Cとは異なり)関数の引数がクロージャを参照する可能性がある言語の場合、そのような「ポインタ」は、クロージャのコンテキストと関数のエントリポイントを含めるか参照する必要があります。

于 2012-04-26T21:08:51.323 に答える