はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
@7_inai_
マングリングとは
マングリング(名前修飾)とは、コンパイラが関数や変数の名前を変更し一意にすること
を指します。
マングリングは、c++のようなコンパイル言語で使用されることが一般的です。
なぜマングリングが必要なの?
①名前空間の解決
プログラムが複数のモジュールやライブラリを持つ場合、同じ名前の関数や変数が使用されていても、マングリングにより区別 できるようになります。
②関数のオーバーロード
同じ名前の関数が異なる引数リストを持つ場合、コンパイラはそれらの関数を区別するために引数の型情報を含めた名前を生成します。これにより、関数オーバーロードが可能になります。
例)
- マングリング前(c++)
void MyClass::myMethod(int, double)
- マングリング後
_ZN8MyClass9myMethodEid
_ZN: グローバル修飾子
8MyClass: クラス名
9myMethod: 関数名
E: 引数の型
i: int型
d: double型
※グローバル修飾子:
C++では、異なるスコープ内で同じ名前の関数や変数を区別するために、名前に修飾子を追加します。この修飾子は、クラス名や名前空間を含むグローバルスコープ(大域スコープ)を表すものです。
③テンプレートの特殊化
テンプレートクラスや関数の特殊化において、テンプレートの特殊化を識別し、正確に対応する具体的な型を選択します。
終わりに
マングリングは一般的にプログラムの内部の実装の詳細であるため、開発者が常に意識する必要はありません。ただし、特にライブラリの開発、外部ライブラリの使用、リンク処理、デバッグ、およびプロファイリングの段階で、マングリングに対する基本的な理解が役立つことがあるので、頭の片隅に覚えておくと良いでしょう。
最後までお付き合いくださりありがとうございました。