2011-02-07 11 views
1

こんにちはコミュニティ 私はC++アセンブリを見ています、私はPARSECスイートからベンチマークをコンパイルしていると私は難しさ、彼らはアセンブリ言語でクラス属性機能に名前を付けない方法を知ることを持っています。C++クラスの機能

_ZL19atomic_load_acq_intPVj 

中:私はそれを操作するためにいくつかの機能を持つクラスを持っている場合、いくつかの調査は、私は、この関数のように表さ

atomic_load_acq_ptr 

であることが判明した後、たとえば、CPPに我々はtest.increment(); のようにそれらを呼び出しますアセンブリ、または少なくともこれは私が知っているものです。

私が間違っている場合は教えてください! マッピングの固定ルールはありますか?または彼らはランダムですか? おかげ

答えて

6

これは、名前の符号化と呼ばれていますが、つまり、プレーン文字-と、数字の名前が明確にコードの塊を識別するのに十分ではありません(理由は過負荷やテンプレートなどの必要があり、名前に埋め込むスペースや<>または::通常は合法ではないため、人の手が読めない形式で追加情報をコピーすると無駄になります)、タイプ、アリティなどによって異なります。

厳密なスキームは異なる場合がありますが、比較的長期間に亘って一貫しています(時には、いくつかのコンパイラでも片方向に解決できます)。

+3

ところで、OPのスキームの正確なルールはhttp://www.codesourcery.com/public/cxx-abi/abi.html#manglingで見つけることができます。 – kennytm

2

これはname mangling.と呼ばれています。コンパイラに依存します。標準的な方法は、申し訳ありません:)

+0

C++標準ではないかもしれませんが、一部のプラットフォームには標準のABIがあります。次に、異なるコンパイラがバイナリ互換コードを作成するようにします。例えば、ARM EABIはよく定義されています。 – doron

+0

@doron:良い点があります。 +1 – neuro

0
+2

いいえ、それは標準ではありません。 – delnan

+0

"C++言語は標準装飾体系を定義していないので、各コンパイラは独自のスタイルを使用します。 –

2

として知られているこれらのシンボルを作成するための標準的な方法がありますC++は、関数のオーバーロードを許可しないこれは1つが同じ名前で異なるパラメータを持つ2つの機能を持つことができることを意味します。バイナリ形式は型を理解しないので、これは簡単です。これが回避される方法は、名前マングリングというスキームを使用することです。これにより、ソースファイルで使用される名前に型情報の関数全体が追加され、正しいオーバーロードが確実に呼び出されます。

追加される余分な文字などは、使用されている特定のアプリケーションバイナリインタフェース(ABI)によって管理されます。異なるコンパイラ(および場合によっては異なるバージョン)は、異なるABIを使用することがあります。