C の場合、コンパイラが出力したオブジェクトファイルを逆アセンブルするか、コンパイラが出力したアセンブリ言語のソースを見ると、C のソースで書いた関数名などの識別子が、ほぼそのままラベルになっていることが分かります。処理系によっては、元の識別子の前に、アンダスコアなどの記号が付く場合もありますが、ほぼ元のままの名前がラベルになっているはずです。
一方、C++ の場合はどうかというと、必ずしもそんな単純なことにはなっていません。具体例を挙げた方が話が早いでしょう。
{
}
という C++ のコードを GCC でコンパイルすると、関数の入り口に相当するラベルは、__Z4funcv という名前になります。この名前の中ほどに、func という文字列は見つかりますが、C の場合に比べれば、かなり大掛かりに変形されています。
C の場合とは異なり、C++ では、同じ名前を持つ関数が複数存在することになります。例えば、関数を多重定義した場合がそうですし、名前空間が異なる場合にも同名の関数が存在することになります。クラスのメンバ関数の場合もそうです。C++ コンパイラは、そのような付加情報をラベルに埋め込むことで、リンク時に適切な関数と結合できるようにしています。このように、関数のシグニチャ(名前と型)をラベルに埋め込むことをマングリングといいます。
上の例では、引数のない関数という最も簡単な例でしたが、引数が複数あったり、const volatile A* const* のような複雑な型の引数がある場合や、テンプレートが絡む場合などは、もっと複雑なラベルになります。また、マングリングの規則は完全にコンパイラの実装に依存するため、異なるコンパイラでコンパイルしたオブジェクトファイルをリンクすることは、(例えオブジェクトファイルのフォーマットが同じであったとしても)原則としてできません。
なお、名前のマングリングが行われるのは、何も関数だけとは限りません。オブジェクト名についても、その型情報が埋め込まれる可能性があります。例え、オブジェクト名に型情報が埋め込まれないとしても、名前空間やクラスに関する(有効範囲の)情報は埋め込まれることになるため、やはり何らかの変形が行われます。
本当に逆アセンブルが必要になるときというのは、何か不具合が発生して、デバッガで追わなければならない場合が多いと思います。そのときになって、マングリングされた魔法の呪文のようなラベルを目にするとパニックに陥りかねません。気持ちに余裕があるときに、是非マングリングされたラベルがどんな風になっているのか、実際に調べてみることをお勧めします。

