Je veux forcer une petite fonction à ne pas être compilée comme fonction inline même si c'est très simple. Je pense que cela est utile à des fins de débogage. Y a-t-il un mot clé pour le faire?
Réponses
Trop de publicités? Dans Visual Studio 2010, __declspec(noinline)
indique au compilateur de ne jamais aligner une fonction membre particulière, par exemple:
class X {
__declspec(noinline) int member_func() {
return 0;
}
};
edit: De plus, lors de la compilation avec /clr
, les fonctions avec des attributs de sécurité ne sont jamais intégrées (encore une fois, cela est spécifique à VS 2010).
Je ne pense pas que cela se révélera utile du tout pour le débogage.
Rappelez-vous que l'in-lining est pertinent à l' appel de la fonction , la même fonction peut être incorporé dans certaines situations et pas incorporé dans d'autres.
Si votre fonction est visible à l'extérieur de l'unité de compilation alors, même s'il est incorporé dans tous les actuelles places il est utilisé, le corps de la fonction doit toujours être disponible pour quiconque veut l'appeler plus tard (en liaison avec le fichier de l'objet).
Afin de disposer d'un site d'appel de ne pas inline, vous pouvez utiliser un pointeur à une fonction.
void (*f_ptr)(int); // pointer to function
volatile bool useMe = true; // disallow optimizations
if (useMe)
f_ptr = myFunc;
else
f_ptr = useOtherFunc;
f_ptr(42); // this will not be inlined
Simple: ne laissez pas le compilateur voir la définition de la fonction. Il est alors impossible de l'inclure. Bien sûr, cela ne fonctionne que si c'est votre code.
Quand il s'agit de déboguer du code tiers ... oui, cela serait utile, surtout si vous pouviez zapper de loin le code tiers. Quiconque a débogué du code contenant beaucoup de déréférencement shared_ptr sait de quoi je parle.
De nombreux compilateurs peuvent effectuer de la croix-traduction-unité inline. Visual Studio a eu pendant cinq ans et je crois que GCC peuvent maintenant faire - surtout depuis l'OP étiqueté comme Visual C++, il y a fort à parier que son compilateur peut faire face.
La façon la plus simple de le faire est de prendre l'adresse de la fonction et de faire quelque chose de non-sens avec elle, à l'instar de l'appeler ou de passer à un OS/externe de la fonction de la bibliothèque. Le compilateur ne peut pas inline ce genre de fonction.
Pourquoi vouloir, IDK.
@commentaires:
Si l'OP srsly, srsly besoin de ça, alors il pourrait compiler comme une lib statique lien.