以下に示す、最大のコンパイラ最適化でコンパイルされたイテレータ クラスの逆アセンブリを見ていました。
class MY_ITR : public std::iterator< std::forward_iterator_tag, MY_TYPE* > {
public:
MY_ITR();
MY_ITR(const MY_TYPE2*, int);
// standard iterator impl
private:
static const int N = 3;
int m_data[N];
};
コピー コンストラクターのように見える余分な関数呼び出しに気付きました。案の定、掘り下げた結果、誰かが std::_Iterator_Base クラスを変更して、空のコンストラクター、コピー コンストラクター、および代入演算子 (?!?!) を含めることを発見しました。この編集が行われた時点 (かなり前) は、コード チェック ツールの警告を回避するためでした。
namespace std {
struct _Iterator_Base {
_Iterator_Base() {}
_Iterator_Base(const _Iterator_Base& rhs) {}
_Iterator_Base& operator =(const _Iterator_Base& rhs) { return *this; }
};
template <...>
struct iterator : _Iterator_Base {
// typedefs
};
...
_Iterator_Base の実装を削除すると、余分な関数呼び出しがなくなります。MY_ITR のコピー コンストラクターの既定の実装では _Iterator_Base のコピー コンストラクターを呼び出す必要があることはわかっていますが、コンパイラーがそれを最適化して削除できなかった理由を一生理解することはできません。