2

私の質問はこれに似ていますが、必要な情報が見つかりませんでした。クラスコンストラクターがあります。

CustomTreeViewItem::CustomTreeViewItem(CustomTreeView* list) 
    : m_childs(), m_expanded(false), m_list(list), m_components(), m_depth(1), 
    m_rect(), m_root(this)
{}

コンストラクターでポインターを使用しthisますが、そこからメソッドを呼び出さないため、未定義の動作を呼び出しません。それですべて問題ありませんが、警告が表示されました。現在、いくつかの lib (小さなフレームワーク) を作成しているため、エラーのないコードを作成する必要があります。したがって、コードを次のように変更しました。

CustomTreeViewItem::CustomTreeViewItem(CustomTreeView* list) 
    : m_childs(), m_expanded(false), m_list(list), m_components(), m_depth(1), 
    m_rect(), m_root(NULL)
{
    m_root = this;
}

今では警告は表示されませんが、この方法ではパフォーマンスが低下します (非常にわずかですが、とにかく損失です)。最高のパフォーマンスを維持し、この警告を回避する方法がないかどうかお尋ねしたいと思います。

4

2 に答える 2

5

ポインターが後で使用するためにのみ保存される場合、標準はこれが完全に安全であることを保証します。

警告を無効にするには、プラグマを使用する必要があります。また、警告制御は移植できません (他のコンパイラはプラグマを無視して警告を出し続ける可能性があります)。

于 2013-09-23T13:54:24.717 に答える
1

最初に、コンパイラはそれについて不平を言うべきではないということです。次のことは、コードの代替バージョン( が (べきである)m_rootに設定され、後で に設定される)は、パフォーマンスにまったく影響を与えない可能性が高いということです。最適化コンパイラは、両方の書き込みを単一の書き込みにマージできる必要があります。アセンブリを見てください。それが追加の書き込みをトリガーしたとしても、変数はhotであるため、それは単なる L1 書き込みであり、コストは目立ちません。NULLnullptrthisthis

于 2013-09-23T13:58:20.067 に答える