27 votes

Quelles sont les règles concernant l'initialisation de la statique non locale?

Supposons que j'ai une classe dont le seul but est de provoquer des effets secondaires causés lors de la construction de ses objets (par exemple, l'enregistrement d'une catégorie avec une usine):

class SideEffectCauser {
public:
  SideEffectCauser() { /* code causing side-effects */ }
};

Supposez aussi que j'aimerais avoir un objet de créer de tels effets secondaires une fois pour chacune de plusieurs unités de traduction. Pour chaque unité de traduction, je voudrais être en mesure de simplement mettre un SideEffectCauser l'objet à l'espace de noms de champ dans la .fichier cpp, par exemple,

SideEffectCauser dummyGlobal;

mais 3.6.2/3 du C++03 standard suggère que cet objet n'a pas besoin d'être construit à moins d'un objet ou d'une fonction dans les .rpc fichier est utilisé, et des articles comme les ce et les discussions en ligne comme les ce suggèrent que de tels objets ne sont parfois pas initialisé.

D'autre part, Est-il possible d'instancier des objets à partir d'une chaîne de caractères contenant leur nom de classe? a une solution qui est revendiquée pour le travail, et je remarque que c'est basé sur l'utilisation d'un objet de type SideEffectCauser comme une donnée membre statique, non pas comme un mondiale, par exemple,

class Holder {
  static SideEffectHolder dummyInClass;
};

SideEffectHolder Holder::dummyInClass;

Les deux dummyGlobal et dummyInClass sont non-locale statique, mais regarder de plus près 3.6.2/3 du C++03 standard montre que ce passage ne s'applique qu'à des objets à portée espace de noms. Je ne peux pas vraiment trouver quelque chose dans le C++03 norme qui dit que lorsque la non-locale de la statique à la portée de classe sont dynamiquement initialisé, si 9.4.2/7 suggère que les mêmes règles s'appliquent à eux comme à des non-locale de la statique à la portée espace de noms.

Question 1: En C++03, est-il une raison de croire qu' dummyInClass est plus susceptible d'être initialisé qu' dummyGlobal? Ou peut aller non initialisée si aucune des fonctions ou des objets dans la même unité de traduction sont utilisés?

Question 2: Ne rien changer en C++11? Le libellé 3.6.2 et 9.4.2 n'est pas le même que le C++03 versions, mais, de ce que je peux dire, il n'y a pas de différence de comportement spécifié pour les scénarios que je décris ci-dessus.

Question 3: Est-il un moyen fiable pour utiliser les objets d'une classe comme SideEffectHolder à l'extérieur du corps d'une fonction de la force des effets secondaires de prendre place?

1voto

Jojje Points 76

Je pense que la seule solution fiable est de concevoir cela pour des compilateurs et des runtime spécifiques. Aucune norme ne couvre l'initialisation des globaux dans une bibliothèque partagée qui, je pense, est le cas le plus complexe, car cela dépend beaucoup du chargeur et donc du système d'exploitation.

Q1: Non Q2: Pas dans un sens pratique Q3: Pas de manière standard

0voto

Alexis Wilke Points 3600

Je suis l'aide de quelque chose de similaire avec g++ / C++11 sous Linux et d'obtenir mon usines enregistré comme prévu. Je ne sais pas pourquoi vous ne seriez pas obtenir les fonctions appelées. Si ce que vous avez décrit est mis en œuvre, il signifie que chaque fonction dans l'unité qu'on doit appeler la fonction d'initialisation. Je ne sais pas trop comment cela pourrait être fait. Mon usines sont aussi à l'intérieur des espaces de noms, bien qu'il soit nommé des espaces de noms. Mais je ne vois pas pourquoi il ne serait pas appelé.

namespace snap {
namespace plugin_name {
class plugin_name_factory {
public:
  plugin_name_factory() { plugin_register(this, name); }
...
} g_plugin_name_factory;
}
}

Notez que le mot-clé static ne doit pas être utilisé en C++, de toute façon. Il est souvent plus lent d'avoir une statique de la définition que mondial.

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