dans ma compréhension, Combien de vitesse pouvons-nous gagner de cela? P>
3 Réponses :
déchiré de ici A>: p>
oui et non. Parfois. Peut-être. P>
Il n'y a pas de réponses simples. Les fonctions en ligne peuvent rendre le code plus rapidement, ils pourraient le rendre plus lent. Ils pourraient rendre l'exécutable plus grand, ils pourraient le rendre plus petit. Ils pourraient provoquer des traverser, ils pourraient éviter de battre. Et ils pourraient être, et sont souvent, totalement non pertinents pour accélérer. P>
Copyright (c) Marshall Cline P>
En bout de ligne: si vous ne savez pas comment l'utiliser - ne l'utilisez pas.
comme indiqué ci-dessus, intégration procédurale code> ....
ci-dessus code> doit avoir un lien !!
Utilisation de Inline Code> fait que le système utilise le système Modèle d'évaluation de substitution , mais cela n'est pas garanti d'être utilisé tout le temps. Si cette option est utilisée, le code généré sera plus long et peut être plus rapide, mais si certaines optimisations sont actives, le modèle de dépouillement n'est pas plus rapide et non plus rapidement. P>
La raison pour laquelle j'utilise (spécifiquement, le compilateur que j'utilise le plus avec les options que j'utilise, Ainsi, à mon avis, l'hypothèse que dans mon code, vous les voyez associés à certaines structures de données ou parfois de variables globales. P> Exemple typique est quand je veux mettre en place un Xorshift Pseudorandom Numberatrice générateur dans mon propre code C: P > le Un autre cas d'utilisation typique est lorsque j'ai des structures de données, et ils ont besoin d'accessoires les fonctions. Par exemple, P> Inline code> Spécificateur de fonction (spécifiquement,
en ligne statique code>) n'est pas à cause de "vitesse", mais parce que
statique code> Partie indique au compilateur La fonction est visible uniquement dans l'unité de traduction actuelle (le fichier actuel étant compilé et inclus fichiers d'en-tête) p> li>
inline code> Partie indique au compilateur, il peut inclure la mise en œuvre de la fonction sur le site d'appel, si elle veut P> LI>
statique en ligne code> indique au compilateur qu'il peut ignorer complètement la fonction si elle n'est pas utilisée du tout dans l'unité de traduction actuelle p>
gcc -wall code>, émet un avertissement si une fonction marquée
statique code> n'est pas utilisée; mais ne délivrera pas un avertissement si une fonction marquée
statique en ligne code> n'est pas utilisée.) p> li>
Statique Inline CODE> nous dit des humains que la fonction est une fonction d'assistance de type macro, ajoutant ainsi un vérificateur de type au même comportement que Macro. P> Li>
ol>
inline code> a quelque chose à voir avec vitesse em> en soi, est incorrecte. Répondre à la question indiquée avec une réponse directe serait trompeuse. P>
statique uint64_t prng_state = 1; code> signifie que
prng_state code> est une variable de type
uint64_t cod>, Visible uniquement dans l'unité de compilation actuelle et initialisée à 1. La fonction
prng_u64 () code> renvoie un entier de pseudorandom de 64 bits non signé. Cependant, si vous n'utilisez pas
prng_u64 () code>, le compilateur ne générera pas de code pour celui-ci non plus. P>
#ifndef GRID_H
#define GRID_H
#include <stdlib.h>
typedef struct {
int rows;
int cols;
unsigned char *cell;
} grid;
#define GRID_INIT { 0, 0, NULL }
#define GRID_OUTSIDE -1
static inline int grid_get(grid *const g, const int row, const int col)
{
if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
return GRID_OUTSIDE;
return g->cell[row * (size_t)(g->cols) + col];
}
static inline int grid_set(grid *const g, const int row, const int col,
const unsigned char value)
{
if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
return GRID_OUTSIDE;
return g->cell[row * (size_t)(g->cols) + col] = value;
}
static inline void grid_init(grid *g)
{
g->rows = 0;
g->cols = 0;
g->cell = NULL;
}
static inline void grid_free(grid *g)
{
free(g->cell);
g->rows = 0;
g->cols = 0;
g->cell = NULL;
}
int grid_create(grid *g, const int rows, const int cols,
const unsigned char initial_value);
int grid_load(grid *g, FILE *handle);
int grid_save(grid *g, FILE *handle);
#endif /* GRID_H */
Au point 3: je pense que "statique" seul suffit, c'est que le compilateur peut sauter la fonction s'il est inutilisé
@CTX: gcc -wall code> émettra un avertissement si une fonction
statique code> n'est pas utilisée, mais pas sur si une fonction
statique en ligne code> n'est pas utilisée. . Devrais-je clarifier cela au point?
Pourquoi pas? C'est nouveau pour moi;) Je me demande, quelle est la raison pour le comportement d'avertissement différent?
@CTX: J'utilise toujours -wall code>. Il active
-wunused-fonction code>: "warn à chaque fois qu'une fonction statique est déclarée mais non définie ou une fonction statique non intégrée n'est pas utilisée." I>
Quant pourquoi on voudrait que l'avertissement avec une fonction statique mais non intégrée, et non avec une fonction en ligne statique, est probablement parce qu'ils pensent dans le même sens que je le fais sur ces quatre points. Ou peut-être existe-t-il un libellé standard obscur C concernant les fonctions inline et non en ligne avec une liaison interne que j'ai manquée, cela rend l'avertissement utile. Ou peut-être que les gens de GCC ont une autre raison, je ne sais pas. Mais j'aimerais penser que la plupart des programmeurs vétéran C sont d'accord avec ces points. :)
Cela peut varier sauvagement - cela pourrait même monter dans quelques cas. Vous devrez mesurer.
Vous enregistrez la fonction d'appel de la fonction. Donc, pour une fonction complexe, cela n'est pas pertinent, mais pour des fonctions triviales, cela pourrait aller bien environ 90% de son temps d'exécution. La ramification elle-même est souvent chère pour les processeurs modernes (flushing de pipeline, problèmes de mise en cache, etc. PP), il peut donc s'agir d'un grand gain pour l'éviter.
Avez-vous essayé d'écrire un exemple d'exemple simple, de désactiver les optimisations et du calendrier des résultats? De toute façon, il va dépendre beaucoup des circonstances qui sont hors de contrôle de votre programme, telles que l'architecture du processeur.
@Marque. Il ne peut que la même chose que l'appel de la fonction.
Le spécificateur de fonction code> inline code> est seulement un indice i> b> que le compilateur est autorisé à aligner la fonction. Le compilateur pourrait ne pas le faire de toute façon. Et il peut décider de fonctions en ligne qui sont pas i> marquées comme
en ligne code> aussi.
En effet, le compilateur est toujours autorisé à aligner un appel de fonction