Performance
Comme cela a été suggéré dans les réponses précédentes, inline
peut rendre le code plus rapide, souvent au détriment de l'augmentation des exécutables. Cependant, les compilateurs modernes sont très bons à l'in-lining automatiquement sans aucune demande de l'utilisateur lorsque la valeur haute de l'optimisation. En fait, les compilateurs sont généralement mieux à la détermination de quoi en ligne pour un gain de vitesse que l'homme.
Déclarer les fonctions inline
explicitement par souci de gain de performance est (presque) toujours inutile!
En outre, les compilateurs peuvent et vont ignorer l' inline
demande si elle leur convient. Compilateurs de le faire si la fonction est difficile à inline (c'est à dire à l'aide non négligeable de la récursivité ou des pointeurs de fonction), mais aussi si la fonction est tout simplement trop grand pour être correctement insérée.
Une Définition De La Règle
Toutefois, la déclaration d'une fonction inline
peut effectivement être nécessaire pour des raisons complètement différentes, à savoir satistfy Une Définition de la Règle (ODR). Cette règle dans la norme C++ indique qu'un symbole donné peut être déclaré plusieurs fois, mais ne peut être défini une fois pour toute. Si l'éditeur de liens (= de l'éditeur de liens) rencontre plusieurs identiques définitions de symboles, il va générer une erreur.
Une solution à ce problème est de faire en sorte qu'une unité de compilation n'est pas à l'exportation d'un symbole donné par le marquant static
(static
– le mot-clé le plus complètement sans rapport avec les significations en C).
Cependant, il est souvent préférable de marquer une fonction inline
à la place. Ainsi, vous permettent au compilateur de ne pas créer la définition de la fonction à tous. C'est souvent très utile lorsque vous travaillez avec des modèles qui, habituellement, doivent être déclarés dans les fichiers d'en-tête.
Par exemple, considérons le programme suivant:
// header.hpp
#include <iosfwd> // for std::ostream&
#ifndef HEADER_HPP
#define HEADER_HPP
template <typename IteratorT>
/*inline*/ void print_all(IteratorT begin, IteratorT end, std::ostream& out, char sep = ' ') {
while (begin != end)
out << *begin++ << sep;
}
#endif // !defined(HEADER_HPP)
// test.cpp
#include <iostream>
#include <vector>
#include "header.hpp"
void test_function() {
using namespace std;
vector<int> vec;
int x;
while (cin >> x) vec.push_back(x);
cout << "Results: ";
print_all(vec.begin(), vec.end());
cout << endl;
}
// main.cpp
#include <iostream>
#include <vector>
#include "header.hpp"
void test_function(); // Forward declaration.
int main() {
using namespace std;
vector<int> xyz(23, 42);
print_all(xyz);
cout << endl << "Test call:" << endl;
test_function();
}
Notez que les deux .cpp
fichiers inclure le fichier d'en-tête et donc la définition de la fonction d' print_all
. Bien que le fichier est enregistré avec comprenant des protections contre la double inclusion, cela entraîne deux définitions de la même fonction, mais dans les différentes unités de compilation.
Maintenant, si vous essayez de lier les deux unité de compilation, disons, à l'aide de la commande suivante:
$ g++ -Wall -pedantic main.cpp test.cpp
vous recevrez un message d'erreur disant "double définition de l' print_all
" ou quelque chose de similaire. Si, toutefois, vous " de la inline
modificateur en face de la définition de la fonction, le code compile et les liens correctement.