[英]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.