__attribute__((always_inline))
force-t-elle une fonction à être alignée par gcc?
Oui.
toujours_en ligne
Généralement, les fonctions ne sont pas intégrées, sauf si l'optimisation est spécifiée. Pour les fonctions déclarées en ligne, cet attribut inline la fonction même si aucun niveau d'optimisation n'a été spécifié.
Cela devrait. Je suis un grand fan de l'incrustation manuelle. Bien sûr, utilisé en excès, c'est une mauvaise chose. Mais souvent, lors de l'optimisation du code, il y aura une ou deux fonctions qui devront simplement être intégrées ou les performances tomberont dans les toilettes. Et franchement, d'après mon expérience, les compilateurs C font généralement pas inline ces fonctions lors de l'utilisation du mot-clé inline.
Je suis parfaitement disposé à laisser le compilateur incorporer la plupart de mon code pour moi. Ce ne sont que ces demi-douzaines de cas absolument vitaux qui m'intéressent vraiment. Les gens disent que "les compilateurs font du bon travail dans ce domaine". J'aimerais en voir la preuve, s'il vous plaît. Jusqu'à présent, j'ai jamais vu un compilateur C en ligne un morceau de code essentiel que je lui ai dit sans utiliser une sorte de syntaxe en ligne forcée (__forceinline
Sur msvc __attribute__((always_inline))
sur gcc).
Oui, il sera. Cela ne veut pas dire que c'est une bonne idée.
Selon la documentation options d'optimisation gcc , vous pouvez régler l'inline avec les paramètres:
-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag
allows coarse control of this limit. n is the size of functions that can be
inlined in number of pseudo instructions.
Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some
of these parameters as follows:
max-inline-insns-single is set to n/2.
max-inline-insns-auto is set to n/2.
Je suggère de lire plus en détail tous les paramètres pour l'inline et de les régler de manière appropriée.
Oui. Il alignera la fonction indépendamment de tout autre ensemble d'options. Voir ici .
Je veux ajouter ici que j'ai une bibliothèque mathématique SIMD où l'inline est absolument essentiel pour les performances. Initialement, j'ai mis toutes les fonctions en ligne, mais le démontage a montré que même pour les opérateurs les plus triviaux, il déciderait d'appeler réellement la fonction. MSVC et Clang l'ont montré, avec tous les indicateurs d'optimisation activés.
J'ai fait comme suggéré dans d'autres articles dans SO et ajouté __forceinline
Pour MSVC et __attribute__((always_inline))
pour tous les autres compilateurs. Il y avait une amélioration constante de 25 à 35% dans la performance dans diverses boucles serrées avec des opérations allant des multiplications de base aux sinus.
Je n'ai pas compris pourquoi ils avaient eu tant de mal à intégrer (le code modèle est peut-être plus difficile?) Mais la conclusion est la suivante: il existe des cas d'utilisation très valables pour l'inclusion manuelle et d'énormes accélérations à gagner.
Si vous êtes curieux, c'est là que je l'ai implémenté. https://github.com/redorav/hlslpp
On peut également utiliser __always_inline
. Je l'utilise pour les fonctions membres C++ pour GCC 4.8.1. Mais n'a pas pu trouver une bonne explication dans le document GCC.