【问题标题】:How to prevent warning C4355: 'this' : used in base member initializer list [duplicate]如何防止警告 C4355:“this”:在基本成员初始化程序列表中使用 [重复]
【发布时间】:2013-09-23 13:48:04
【问题描述】:

我的问题与this one 类似,但我没有找到我需要的信息。我有我的类构造函数。

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

我在构造函数中使用this 指针,但不从中调用任何方法,因此我不会调用未定义的行为。所以一切都很好,但是我收到了警告,现在我正在编写一些库(小框架),所以我必须编写无错误的代码。所以我把我的代码改成了这样:

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;
}

现在我没有收到任何警告,但是这样我会失去性能(非常轻微,但无论如何都是损失)。我想问是否有任何方法可以保持最高性能并防止出现此警告。

【问题讨论】:

  • 您确定启用优化会导致性能下降吗?在这里 g++ 生成的程序集似乎没有什么不同。此外,如果您确切知道自己在做什么,您可以使用 #pragma 禁用警告。
  • @nijansen 这将用于新项目和旧项目(非常旧),因此编译器会有所不同。

标签: c++ constructor this compiler-warnings


【解决方案1】:

如果指针只是为了以后使用而存储,标准保证这是完全安全的。

您可能需要使用编译指示来禁用警告。并且警告控制是不可移植的(其他编译器可能会忽略您的编译指示并继续警告)。

【讨论】:

    【解决方案2】:

    首先是编译器不应该抱怨这一点,其次是代码的替代版本,其中m_root 设置为NULL(应该是nullptr),然后设置为@987654324 @ 很可能根本不会对性能产生影响。任何优化编译器都应该能够使用this 将两个写入合并为一个写入。看看组装。即使这触发了额外的写入,该变量也是 hot,因此它只是 L1 写入,成本不会明显。

    【讨论】:

    • 完全同意;从我目前测试的结果来看,如果您在启用优化的情况下进行编译,编译器也同意这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多