Est-il possible de forcer une fonction de ne pas être inline?
Je veux forcer un peu la fonction de ne pas être compilé en fonction en ligne, même si c'est très simple. Je pense que c'est utile pour le débogage but. Est-il un mot-clé pour ce faire?
- Le débogueur peut gérer inline fonctions de l'amende juste. Pas besoin de prévenir l'in-lining à cause de cela.
- Pas vraiment. Excellente façon d'accrocher le débogueur de longues minutes alors qu'il définit des milliers de points d'arrêt.
- Lorsque le pied grâce à l'optimisation de code (en gros, vous avez à faire à l'assemblée niveau de langue), il est parfois agréable de voir des appels à des fonctions parfois, de sorte que vous pouvez les suivre là où vous êtes, et pas dans un aller-puisque le compilateur de vue de la "simple" peut ne pas être la vôtre. (Le débogueur peut faire face très bien avec tout cela, mais c'est l'opérateur qui a fait faire le travail...)
- En plus de débogage, je voulais aussi le faire à des fins de profilage. Une fonction a été d'être incorporé sans m'indiquant qu'il devrait être. Cependant, c'était la fonction spécifique que je voulais voir dans le profil.
- Vous ne devriez pas être le débogage de code optimisé. Débogage implique que vous essayez de vous corriger le code, une seule fois il n'a plus besoin de fixation doit vous l'optimiser. Même si vous déclarez une fonction de "inline" (qui n'est en fait qu'une suggestion) VS ajoute des données à la version debug qui nous allons étape par le biais de l'exécutable comment les lignes de code à exécuter.
- Il y a des moments où vous avez à la version de débogage de code, ou si vous avez des dumps de la libération code
- en effet, il y a des moments lorsque le code est tellement mal écrit et testé que quand il se casse, vous pouvez logiquement travail où dans le code de la faute ou simplement compter sur les vidages de mémoire. Je plains l'homme qui a afin de maintenir un tel code, et le mépris des fecker qui l'a écrit en premier lieu.
Vous devez vous connecter pour publier un commentaire.
Dans Visual Studio 2010,
__declspec(noinline)
indique au compilateur de ne jamais inline un membre particulier de la fonction, par exemple:edit: de plus, lors de la compilation avec
/clr
, des fonctions avec les attributs de sécurité de ne jamais obtenir inline (encore une fois, ceci est spécifique à VS 2010).Je ne pense pas qu'il sera utile lors du débogage, si.
__declspec(noinline)
pour VC++. Contrairement à l'homme de page, ce qui semble fonctionner pour autoportant fonctions, et je ne pense pas que j'ai jamais utilisé pour une fonction membre. Vous pouvez-mais notez que je n'ai jamais -- envisager de jouer avec les options d'optimisation, de sorte que seulementinline
fonctions sont prises en compte pour l'in-lining, même si bien sûr cela a un effet global et qui peut ne pas être ce que vous voulez.__attribute__((noinline))
pour gcc (et un certain nombre de moins-commune de compilateurs de soutien à la gcc de la syntaxe d'attribut). Je dois admettre, je ne pense pas que j'ai jamais utilisé, mais il semble être là.(Bien sûr, ces deux styles de l'annotation aller dans des endroits différents, donc c'est un peu ennuyeux pour construire le code c'est d'un goût agréable à la fois.)
Je ne suis pas sûr de savoir comment l'un de ces interagir avec le
inline
C++ mot-clé; j'ai seulement utilisé lors du débogage (quand je veux juste un particulier non-fonction inline gauche pas inline après optimisation) ou lors de l'examen du code généré (et je suis confondu parce que des trucs aléatoires est inline).noinline
?Rappelez-vous que l'in-lining est pertinente à la appel de fonction site, 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 l'actuel endroits 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.
Simple: Ne pas laisser le compilateur voir la définition de la fonction. Alors il ne peut pas être insérée. Bien sûr, cela ne fonctionne que si son votre code.
Quand il s'agit de débogage de la 3e partie du code... oui, ce serait utile, en particulier si vous pouviez zap 3ème partie du code de loin. N'importe qui qui a de débogage de code qui contient beaucoup de shared_ptr déréférencement 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 vous ne pourriez jamais vouloir, IDK.
@commentaires:
Si l'OP srsly, srsly besoin de ça, alors il pourrait compiler comme une lib statique lien.
Vous pouvez diviser la classe de mise en œuvre entre un en-tête et un fichier cpp. si vous mettez la fonction en dehors de la définition de la classe, de votre fonction ne sera pas en ligne.
Si c'est une fonction membre d'une classe, faire virtuel.
Je ne vais même pas tenter de répondre à cette question, car il n'est pas pertinent de s'en inquiéter, sauf pour les deux raisons évoquées ci-dessous.
Inline est fondamentalement
(Certains voudraient changer l'ordre de ces deux-là, mais je m'en tiens à l'ordre traditionnel.)
À moins que ce soit A) vous devez absolument définir une fonction dans certains d'en-tête ou B) vous êtes le profilage et l'optimisation d'un morceau de code et de savoir mieux que le compilateur de ce qui devrait être incorporé et ce qui ne devrait pas, d'inlining ne devrait pas être vous préoccupe.
Il a certainement ne devrait pas être un problème en raison de débogage. Votre débogueur doit (et dans le cas de VC aussi ne) de prendre soin de cela pour vous.
PUSH
ed en tant que paramètres à une fonction. De cette façon, ma première variable est toujours en [EBP+8], mon deuxième à [EBP+C] et ainsi de suite.