2017-06-29 1 views
-2

私は、friend functionがメモリ(RAM)上の配置にどのように影響するかを理解しようとしています。C++友達の機能はどのようにメモリの場所が異なりますか?

たとえば、各クラスには、すべてのメソッドと関数のテーブルがあります。また、仮想関数はvtableに配置されています。

friendの関数はどこに属していますか?

私が心配している理由は、私のC++コードで複数のスレッドから多数回呼び出された[再帰]関数が原因で、最終的には"v'table破損ランタイム例外 "。これはメモリ破損の兆候です(例:as I saw here)。

また、この関数を通常のクラス外関数として宣言すると、例外が引き続き発生します。

しかし、この関数をfriendと宣言すると(これは悪い設計ですが、実験のために)、その例外はポップアップしなくなりました。

友人の機能のメモリの場所について私の質問。

+7

*「各クラスにはすべてのメソッドと関数の表があります」* - あなたは何に基づいて言いますか? C++標準には言及されていません。 – StoryTeller

+0

フレンド機能は**有益なクラスのメンバ関数ではありません –

+1

*たとえば、各クラスにはすべてのメソッドと関数の表があります。バーチャルのものにはvtableがありますが、それだけです。 – Borgleader

答えて

8

friendは、コンパイラ、リンカ、またはランタイムローダが関数を置く場所とは関係がありません。コンパイラに、クラスの可視性の規則を回避できることをコンパイラに知らせる単なるキーワードです。

friend関数がクラス内でインラインで定義されていても、それはまだグローバル非メンバー関数とみなされます。

関連する問題