2015-09-23 2 views
4

очень новый для C++.inlining не удалось вызвать маловероятный и размер кода будет расти [-Winline], но не использует встроенный

Вот мой определенный пользователем класс fmiNode: (fmi.h)

class fmiNode 
{ 
public: 
    fmiNode(std::string NodeName,int Address) 
    { 
     this->name = NodeName; 
     this->address = Address; 
    } 

    std::string GetName() 
    { 
    return this->name; 
    } 

    int GetAddress() 
    { 
    return this->address; 
    } 

private: 
    std::string name; 
    int address; 
}; 

Вот мой основной метод (fmi.c)

int main (int argc, char *argv[]) 
{ 
    fmiNode node1("NodeA",4); 
    fmiNode node2("NodeB",6); 
    fmiNode node3("NodeC",8); 
    fmiNode node4("NodeD",10); 

    while(1) 
    { 
     MainLoop(); 
    } 
} 

Если бы я только один экземпляр объекта fmiNode все хорошо. но следующие 3 вызывает предупреждение:

warning: inlining failed in call to ‘fmiNode::fmiNode(std::string, int)’: call is unlikely and code size would grow [-Winline] 

Что я здесь делаю неправильно.

EDIT:

Так что я должен определить свой класс, как это :?

class fmiNode 
{ 
public: 
    fmiNode(std::string NodeName,int Address); 

    std::string GetName() 
    { 
    return this->name; 
    } 

    int GetAddress() 
    { 
    return this->address; 
    } 

private: 
    std::string name; 
    int address; 
}; 

fmiNode::fmiNode(std::string NodeName,int Address) 
{ 
    this->name = NodeName; 
    this->address = Address; 
} 

Cheers, Rhys

ответ

4

Если определить функцию (конструктор, в вашем случае) внутри определения класса, то результат будет таким же, как определение его вне класса с inline ключевым словом, а в соответствии со стандартом C++:

7.1.2.3 функция, определенная в определении класса является встроенная функция

Итак, компилятор получает подсказку inline, но считает, что вложение конструктора в main - плохая идея из-за причин в предупреждающем сообщении, поэтому оно дает вам предупреждение.

Update: да, вы должны определить класс, как в вашем EDIT, чтобы избежать этого предупреждения. Еще лучше, поместите определение в файл .cpp, чтобы избежать нескольких ошибок определения.

+0

Спасибо. Отредактированный пост с тем, что я считаю правильным. –

+0

@Rhys, да, вы правы в этом. – SingerOfTheFall

+0

Большое спасибо, потраченные века, ища ответ! :) –