27 votes

Deux pointeurs de fonction vers la même fonction sont-ils toujours égaux ?

La norme C++ garantit-elle que deux pointeurs vers une fonction sont toujours égaux ? Je comprends que cela sera normalement vrai pour les fonctions non inline. Mais s'il existe une fonction inline et qu'un pointeur vers cette fonction est créé dans deux unités de compilation distinctes, l'éditeur de liens fusionnera-t-il les deux instanciations, ou est-il autorisé à émettre des fonctions en double ?

Si la réponse à la question ci-dessus est "ils sont égaux" : Est-ce que cela reste valable s'il y a un en-tête commun avec une fonction en ligne, et que le programme principal et un plugin chargé dynamiquement (objet partagé/DLL) créent un pointeur vers la fonction ?

26voto

Simple Points 4460

La section §5.10/1 de la norme C++11 dit :

Deux pointeurs du même type sont égaux si et seulement s'ils sont tous deux nuls, tous deux pointent vers la même fonction, ou tous deux représentent la même adresse

Deux copies du même inline sont toujours la même fonction. Du point de vue de l'implémentation, le compilateur génère une copie de la fonction dans chaque unité de traduction, mais l'éditeur de liens jette ensuite l'une des copies pour qu'il n'en reste qu'une.

En prenant l'adresse d'une fonction, vous l'empêchez d'être inlined (différent de inline qui vise plutôt à éviter la violation de la règle de la définition unique).

Les DLL sont en dehors du champ d'application de la norme, mais une seule copie de la fonction restera dans l'image binaire, de sorte que l'obtention de l'adresse de la fonction (par ex. GetProcAddress ) de la DLL obtiendra le même pointeur de fonction que le code à l'intérieur de la DLL.

8voto

Jesse Good Points 22971

La norme C++ garantit-elle que deux pointeurs vers une fonction sont toujours égaux ?

Oui, deux pointeurs qui pointent vers la même fonction sont égaux.

Est-ce que cela reste valable s'il y a un en-tête commun avec un inline et que le programme principal et un plugin (objet partagé/DLL) chargé dynamiquement (objet partagé/DLL) chargés dynamiquement créent un pointeur vers la fonction ?

Oui, selon 7.1.2.p4

Une fonction en ligne avec une liaison externe doit avoir la même adresse. dans toutes les unités de traduction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X