Les opérateurs sont-ils toujours en ligne?Si j'implémente un opérateur pour une classe, est-ce possible qu'il ne soit pas en ligne?
struct foo {
void operator()() {
// Do tons of work.
}
};
int main() {
foo f;
f();
}
Les opérateurs sont-ils toujours en ligne?Si j'implémente un opérateur pour une classe, est-ce possible qu'il ne soit pas en ligne?
struct foo {
void operator()() {
// Do tons of work.
}
};
int main() {
foo f;
f();
}
Le compilateur est le seigneur sans précédent et officiellement (imprévisible) des décisions inlining. Les bons compilateurs fourniront quelques conseils dans la documentation sur leur comportement d'implémentation. Plus le code est compliqué, moins il est probable qu'il soit en ligne, vous pouvez trouver quelques exemples de ce qui n'a pas tendance à être intégré sur Wikipédia.
"Faire des tonnes de travail" par lui-même suggère que votre opérateur prévu est trop compliqué pour la plupart des compilateurs à intégrer.
Le compilateur Visual C++ de Microsoft peut être amené à générer des avertissements lorsqu'il décide d'intégrer une fonction qui n'a pas été marquée en ligne et lorsqu'elle ne contient pas une ligne marquée en ligne. Je l'aime pour avoir une idée de ce que peut en ligne.
Non, ils ne sont pas. Le compilateur est complètement libre d'ignorer toutes les demandes qu'une fonction soit en ligne. Ce qu'il ne peut pas ignorer, c'est qu'il doit leur donner un lien interne, de sorte qu'un en-tête les contenant peut être inclus dans plusieurs unités de traduction.
Un opérateur est une fonction normale comme toute autre fonction.
Mais un opérateur (ou toute autre fonction) avec un corps défini dans une classe est une demande explicite que la fonction soit inline - ce que le compilateur peut ignorer. –
@Neil: Je ne suis pas sûr de ce que vous voulez dire. "... comme toute autre fonction" a bien couvert cela. – sbi
@sbi La réponse ne mentionne pas inlining. –
Il est faux que les fonctions en ligne doivent avoir une liaison interne. Par défaut, les fonctions 'inline' n'obtiennent pas de liaison interne. Ils obtiennent une exemption de ODR, et le programme a l'obligation de les définir dans chaque TU où ils sont utilisés mais ils ont toujours la même fonction (par exemple, l'adresse de l'item de données statiques dans une fonction inline doit toujours avoir la même valeur). –