別の質問のタイトルは次 のようになります:特定の翻訳単位で、コンパイラによって生成されたコンストラクターのコードをコンパイラーに明示的に生成させるにはどうすればよいですか?
私たちが直面している問題は、1 つのコード パスについて、1 つのオブジェクトの copy-ctor 呼び出しがインライン化されていない場合 (つまり、このコンストラクターが手動で実装されている場合) に、(徹底的に測定された) パフォーマンスが (約 5%) 向上することです。(コードのクリーンアップ中に、このクラスの余分な明示的に実装されたコピー ctor (17 メンバー) が削除されたため、これに気付きました。)
編集:生成されたアセンブリ コードをチェックし、2 つの異なるコード バージョンについて説明したように、インライン化とコード生成が行われていることを確認したことに注意してください。
ここで、手動の copy-ctor コードを元に戻す (コンパイラが生成したものとまったく同じ) か、このクラスの copy-ctor をインライン化しない他の手段を見つけるかの選択に直面しています。
特定の翻訳単位でコンパイラが生成したクラス関数を明示的にインスタンス化する手段 (Microsoft Visual C++ の場合) はありますか? または、それらが使用される各翻訳単位で常にインライン化されますか? (状況をよりよく把握するために、gcc やその他のコンパイラに関するコメントも歓迎します。)
最初の2つの答えは誤解を示しているため、コンパイラによって生成されたクラス関数は、ユーザーによって宣言も定義もされていない場合、コンパイラ自体によってのみ生成されます。したがって、これらの関数はソースコードに存在しないため、修飾子を適用することはできません。
struct A {
std::string member;
};
A
デフォルトおよびコピー ctor、dtor、およびコピー演算子があります。これらの関数はコードに存在しないため、一部の declspec を介して変更することはできません。
struct B {
std::string member;
B(B const& rhs);
};
B
現在、ユーザー提供のコピー ctor があり、ユーザーはそれを実装する必要があります。コンパイラはそのコードを生成しません。
懐疑論者のためのもう少し背景:-) ...
このコードは MS Visual C++ を使用してコンパイルされていますが、組み込み (のような) (リアルタイム) システム用にリンクされています。パフォーマンスは、このシステムでタイミングを取ることによって測定されたので、タイミングを取った人はまともな数値を持っていると思います.
このテストは、2 つのコード バージョンを比較することによって実行されました。唯一の違いは、この 1 つのクラスのインラインと非インライン コピー ctor でした。インライン コードのタイミングは、約 5% 悪化しました。
さらに調べたところ、ある点で私が間違っていたことが明らかになりました。コンパイラは、複雑なコピー コンストラクターに対して個別の関数を生成します。これは独自の裁量で行われ、最適化設定にも依存します。したがって、私たちの場合、コンパイラは特定の状況で間違ったことをしています。これまでの回答から、コンパイラーに別の方法で伝えることができるようには見えません。:-(