POD上生成的构造函数与非POD案例

时间:2016-08-09 13:21:32

标签: c++ constructor compilation

我知道如果没有为类声明构造函数,编译器将生成一个。 但是,在编译了以下(g ++或clang ++)并使用此代码执行nm -C之后 - 具有非POD数据成员 - 我确实看到了生成的Ctor:

class X
{
public:
    void SetName(std::string name) {m_name = name;}
private:
    std::string m_name;
};

int main()
{
    X x1;
    x1.SetName("jude");

    return 0;
}

但是使用此代码 - 使用POD数据成员 - 我不会:

class X
{
public:
    void SetNum(int num) {m_x = num;}
private:
    int m_x;
};

int main()
{
    X x1;
    x1.SetNum(8);

    return 0;
}

我以为在这两种情况下我都会看到生成的构造函数。这种行为是否符合标准?或者这是其他什么东西在这里发生?

2 个答案:

答案 0 :(得分:4)

的情况下
class X
{
public:
    void SetName(std::string name) {m_name = name;}
private:
    std::string m_name;
};

必须生成构造函数,因为m_name需要默认构造。

的情况下
class X
{
public:
    void SetNum(int num) {m_x = num;}
private:
    int m_x;
};

默认构造m_x与不执行任何操作相同,因为变量未初始化。由于不生成和调用构造函数会使构造函数做同样的事情,编译器可以在"as-if" rule下对其进行优化。

答案 1 :(得分:0)

nm -C的输出受as-if规则的约束。请记住,inline只是对编译器的一个提示,它可以使用它认为合适的任何其他提示 - 包括函数的复杂性。显然,这两个构造函数的复杂程度各不相同。实际上,在POD情况下,生成的ctor实际上是微不足道的,编译器内联它是完全合理的。