繁体   English   中英

在POD与非POD情况下生成的构造函数

[英]Generated constructor on POD vs non-POD cases

我知道,如果没有为类声明构造函数,则编译器将生成一个。 但是,在编译以下代码(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;
}

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

如果是

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等同于不执行任何操作,因为该变量未初始化。 由于不生成并调用构造函数会执行相同的操作,因此构造函数会执行编译器可以根据“如果”规则对其进行优化。

的输出nm -C 被作为-如果规则约束。 请记住, inline只是对编译器的提示,它可以使用它认为合适的任何其他提示-包括函数的复杂性。 显然,这两个构造函数的复杂度有所不同。 实际上,在POD情况下,生成的ctor从字面上看是微不足道的,对于编译器进行内联是完全合理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM