1

こんにちはコミュニティ私はC++アセンブリを見ています、私はPARSECスイートからベンチマークをコンパイルしました、そして私はそれらがアセンブリ言語でクラス属性関数にどのように名前を付けるかを知るのに苦労しています。たとえば、それを操作するためのいくつかの関数を持つクラスがある場合、cppではそれらを次のように呼び出します。test.increment(); いくつかの調査の後、この関数は次のようになります。

atomic_load_acq_ptr

として表される:

_ZL19atomic_load_acq_intPVj

組み立て中、または少なくともこれは私が見つけたものです。

私が間違っているかどうか教えてください!マッピングに固定されたルールはありますか?またはそれらはランダムですか?ありがとう

4

4 に答える 4

6

これは名前マングリングと呼ばれ、オーバーロードやテンプレートなどのために必要です(つまり、単純な文字と数字の名前では、コードのチャンクを明確に識別するのに十分ではありません。スペースや名前を名前に埋め込むこと<>::通常は合法ではありません。凝縮されていない、人間が読める形式の追加情報は無駄になります)。したがって、タイプ、アリティなどによって異なります。

正確なスキームはさまざまですが、通常、各コンパイラーは比較的長い間自己矛盾がありません(場合によっては、複数のコンパイラーでさえ一方向に解決できます)。

于 2011-02-07T11:17:51.323 に答える
2

それは名前マングリングと呼ばれます。。コンパイラに依存します。標準的な方法はありません、ごめんなさい:)

于 2011-02-07T11:18:18.203 に答える
2

C ++では関数のオーバーロードが可能です。つまり、同じ名前でパラメーターが異なる2つの関数を持つことができます。あなたのバイナリフォーマットはタイプを理解しないので、これは問題です。これを回避する方法は、名前マングリングと呼ばれるスキームを使用することです。これにより、ソースファイルで使用される名前に型情報の関数全体が追加され、正しいオーバーロードが呼び出されるようになります。

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

于 2011-02-07T11:22:36.783 に答える
0

はい、名前マングリングと呼ばれるこれらの記号を作成するための標準的な方法があります。

于 2011-02-07T11:20:16.133 に答える