permet d'avoir une petite classe appelée myclass em>. J'étais intéressé comment l'apparence de la différence d'origine lorsque la méthode est h: p> cpp: p> MAIN: P> .section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 14
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
leaq -8(%rbp), %rdi
movl $0, -4(%rbp)
callq __ZNK7myClass4getAEv
xorl %ecx, %ecx
movl %eax, -12(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function
.subsections_via_symbols
4 Réponses :
Pour une fonction d'infinle de manière fiable, la définition complète de la fonction doit être disponible dans l'unité de traduction que l'appel apparaît dans.
Depuis la définition de Pour permettre cette fonction d'être inlinée, vous aurez besoin de déclarez-le comme myClass :: getA () code> n'est pas visible pour
main.c code>, la fonction ne peut pas être inlinée. Il pourrait être inliné dans tous les appels qui sont apparus dans
myClass.cpp code>, mais vous n'en avez pas de ceux-ci. P>
inline code> dans le fichier d'en-tête et inclure sa définition, par exemple p>
Qu'entendez-vous par «fiable»?
LTO existe, mais est assez floconneux car il ne sait pas quelles annotations le programmeur prévu i> d'être utilisé en toute sécurité à travers les TU.
Fwiw the inline code> dans votre exemple est redondant. Les définitions des membres en ligne sont implicitement intégrées.
Le mot clé code> inline code> a peu à voir avec dire au compilateur aux appels en ligne à la fonction. Quel Utilisation du mot clé code> inline code> dans une définition de la fonction permet de définir la fonction dans plusieurs unités de traduction sans violer la règle d'une définition tant que toutes les définitions sont identiques. P>
Définition d'une fonction en ligne dans un en-tête peut aider le compilateur en ligne appelle à la fonction en permettant la définition complète d'être visible dans plusieurs unités de traduction, mais c'est tout le mot clé inline code> permet à la fonction d'être définie em> en ligne dans un en-tête. P>
inline code> a à voir avec l'afflexion appels. P>
Vous n'avez pas donné au compilateur une chance à inline Vous pouvez utiliser des optimisations complètes à l'exception de l'optimisation intercédratante (IPO; car cela peut permettre au compilateur d'être même en ligne myClass :: getA () code> (comme expliqué dans une autre réponse). Pour comparer les méthodes Inline Versus hors ligne, comparez l'utilisation de
getA () code> et
gettalt () code> dans le code ci-dessous
myClass :: gettalt () code>). P> p>
Vous pouvez obtenir des choses inline avec Le point principal de Les compilateurs modernes utilisent toujours leurs heuristiques normales pour décider si elle vaut la peine d'être inlinité ou non. par exemple. Une grande fonction avec plusieurs appelants ne sera probablement pas inline, pour éviter que le code de code. gcc -o0 code> ne permet pas d'activer
-Finline-fonction code>, donc même si les fonctions étaient dans le même fichier, cela n'essaierait pas. Voir aussi Pourquoi cette classe wrapper C ++ Ne pas être inliné? . (Ne vous inquiétez pas d'essayer d'utiliser
__ attribut __ ((toujours_inline)) CODE>: Vous obtiendrez l'inlinage, les choses ne seront pas optimales. P>
GCC -O3 -FWHOO-PROGRAM-PROGRAMME * .CPP code> pour activer l'inlinication des fichiers source. (Indépendamment de ce qu'ils ont été déclarés
Inline Code> ou non, c'est juste au compilateur pour décider de ce qui est le mieux). P>
en ligne code> est de laisser le compilateur savoir qu'il n'a pas besoin d'émettre une définition autonome d'une fonction si elle choisit de l'aligner sur tous les appelants. (Parce qu'une définition, non seulement une déclaration, cette fonction apparaîtra dans toutes les unités de traduction qui l'utilisent. Donc, si un autre fichier décide de ne pas l'aligner, une définition peut être émise là-bas.) P>
statique code> Indique au compilateur qu'aucune autre unité de traduction ne peut voir la fonction, donc s'il n'y a qu'un seul appelant dans ce fichier, il sera très probablement en ligne. (Si vous avez une grande fonction, c'est une mauvaise idée de le faire
statique en ligne code>. Vous obtiendrez une copie de la définition dans chaque fichier dans lequel il n'entrent pas en ligne et l'affranchissement trop agressif. Pour une petite fonction qui va probablement aligner partout, vous devez probablement toujours simplement utiliser
inline code>, pas
statique inline code>, donc au cas où quelque chose prend l'adresse de la fonction là-bas. une définition partagée sur tous les fichiers.
inline code> indique à la liaison de fusionner des définitions en double en double d'une fonction au lieu d'erreurs. Ce comportement est l'une des parties les plus importantes de ce que
en ligne code> , pas l'indice réel du compilateur que vous voulez en ligne.) p>
gcc -fwhaole-programme code> (avec tous les fichiers source de la même ligne de commande) donne aux informations suffisantes du compilateur pour effectuer toute ces décision elle-même. Il peut voir si une fonction comporte un seul appelant dans l'ensemble du programme et la configurine au lieu de créer une définition autonome plus argumentation et un appel
p>. P>.
gcc -flto code> permet une optimisation du temps de liaison similaire au programme entier, mais ne nécessite pas tous les fichiers
.cpp code> de la ligne de commande à la fois. Au lieu de cela, il stocke le code de gimale dans les fichiers
code> et termine optimisant à l'heure de liaison. P>
Le compilateur peut ignorer la directive
inline code> et la plupart du temps le fera. La principale raison de l'utilisation de
en ligne code> en C ++ est de spécifier le lien, de ne pas indiquer au compilateur quoi faire.
Vous voulez que l'attribut
noinline code> spécifique à la GCC. Stackoverflow.com/a/1474050/2945027
inline code> dans le fichier .cpp est toujours faux.
@Sergeya non-sens (votre toujours i>). Il existe de nombreuses bonnes raisons pour les fonctions code> inline code> D dans le fichier .CPP: Ceux qui ne sont pas exportés (et ne font pas partie d'une interface implémentée dans ce fichier), vivant principalement dans un espace de noms anonyme.
@Walter s'ils sont dans un espace de noms anonyme, ils n'ont pas besoin d'être marqués
en ligne code> car ils ne seront jamais définis qu'une seule fois.
@Walter non-sens, on dirait que vous ne comprenez pas le but de
en ligne code>. Les fonctions non exportées doivent soit être
statique code> ou définie dans l'espace de noms anonyme.
En ligne Code> Le mot-clé n'affecte pas le lien, et comme tel, n'empêche pas les fonctions d'être exportées.