特定の C++ クラスのフレンドとして宣言された C++ 関数に、内部リンケージがあることを確認する必要があります。
関数をフレンドにする必要があるのは、関数の結果をキャッシュするプライベート メンバーである、そのクラスのプライベート メンバーへのアクセスが必要だからです。
関数が同じクラスの非メンバー (または少なくともインスタンス メンバーではない) である必要がある理由は、他のコードがその関数への非メンバー関数ポインターを取得できる必要があるためです。これをリファクタリングするとコストがかかりすぎます。
内部リンケージが必要な理由は、これらの関数が多数あり、AIX ではそれらの関数が多すぎると、リンク時に TOC オーバーフロー エラーが発生するためです。これはリンカー スイッチを使用して克服できますが-bbigtoc
、今のところこれを回避しようとしています。
また、クラス宣言をヘッダー ファイルに保持し、関数自体を実装を含む .cxx ファイルに配置できるようにしたいと考えています。
要約すると、現在、次のようなものがあります。
class Foo
{
private:
mutable Qux cachedBarResult;
// ... more code here ...
public:
friend const Qux & Bar(const Foo &);
};
const Qux & Bar(const Foo & foo)
{
if (foo.cachedBarResult.isEmpty())
{
foo.cachedBarResult = _worker_Bar(foo);
}
return foo.cachedBarResult;
}
static Qux _worker_Bar(const Foo & foo)
{
// real Bar work
}
Bar
内部リンケージを作りたい。それはできますか?