2012-04-26 10 views
2

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

最も一般的な考え方は、具体的な実装は重要ではありません。そして、sizeofが関数に適用されないのはなぜですか?私は本当にこれについて興味があります、私の考えが最初から間違っている場合(言い換えれば、それを間違った方法で考えている場合)、私はお詫び申し上げます。

+1

'sizeof'と関数ポインタは、言語に固有です。 –

+0

@ n.m。 - はい、しかし、私は関数のサイズが命令とローカル変数の数によってどのように増加するのか不思議です。私は正しい質問をしているかどうか分からないが、うまくいけば、私が尋ねようとしているものを捕まえる人もいるだろう。 –

+0

[呼び出し規約](http://en.wikipedia.org/wiki/Calling_convention)に関する資料をお探しですか? – Christian

答えて

3

言語によって異なります。コンパイルされた言語の場合、関数はマシンコードとしてメモリに表されます。あなたは一般的に彼らの製造元からdocumentation for widely used processorsを得ることができます。

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

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

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

+0

ありがとうございました。 –

関連する問題