2016-08-09 2 views
1

Я знаю, что если конструктор не объявлен для класса, компилятор его сгенерирует. Однако после компиляции следующей (г ++ или звоном ++) и делать nm -C с этим кодом - то есть не-POD элемент данных - я вижу сгенерированную CTOR:Генерируемый конструктор в случаях POD vs non-POD

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

Я думал, что я увижу сгенерированный конструктор в обоих случаях. Соответствует ли это стандарту стандарту? Или это что-то еще, что здесь происходит?

ответ

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.

+0

Есть ли компиляция \ связанный флаг, который я могу использовать для отключения этой оптимизации? – HeyJude

+0

@HeyJude Я не уверен. Отключение оптимизации может помочь, но это действительно не решение. Вам действительно нужен конструктор? Это не-op. – NathanOliver

+0

@HeyJude Вы можете скомпилировать коды без main(), просто создавая файлы .o и проверяя их. – Walter

0

Выход nm -C: не, связанный правилом как. Помните, что inline - это всего лишь подсказка для компилятора, и он может использовать любой другой намек, который он считает нужным, включая сложность функции. Очевидно, что эти два конструктора различаются по сложности. Фактически, в случае POD сгенерированный ctor буквально тривиален, и вполне разумно, чтобы компилятор включил это.