10
votes

Change-t-il l'ordre des membres de données privées de classe enfreint ABI

J'ai une classe avec nombre de membres de données privés (certaines statiques), accessibles par des fonctions de membre virtuel et non virtuelle. Il n'y a pas de fonctions inline et pas de classes d'amis.

class A
{
    string str;
    static const int static_const_number;
    int number; // <--   integer member moved here
    bool b;
    ...
};


2 commentaires

Notez que dans votre cas, vous devrez déclarer un constructeur et destructeur, car les deux sont autrement fournis autrement.


@ Joohannes Oui, ils sont déclarés, ils ont simplement manqué dans la description. Mais merci pour la note, c'est utile.


4 Réponses :


12
votes

Cela pourrait, oui, si, sans autre raison que la taille de A pourrait être différente due à des différences dans l'emplacement et le nombre d'octets de remplissage entre les éléments de données.


0 commentaires

3
votes

C ++ définit non abi. La seule réponse correcte ici est "Cela dépend de votre compilateur". La réponse est probablement oui.


0 commentaires

3
votes

Il va probablement casser n'importe où que vous avez des implémentations compilées à plusieurs binaires, car vous pouvez vous retrouver avec deux fichiers binaires avec des fonctions qui accèdent des membres privés ordonnés différemment. Cela inclut les implémentations de fonctions virtuelles, car elles peuvent avoir leurs implémentations de non-remplacement compilées dans plusieurs binaires également.

Le meilleur moyen est d'utiliser les fonctions virtuelles pure et d'exposer ces interfaces d'un "hôte" binaire. Ensuite, des fichiers binaires supplémentaires n'ont pas besoin d'une implémentation, ils appellent donc toujours la mise en œuvre dans le binaire «hôte», ce qui ne signifie pas de place à une incohérence.


1 commentaires

C'est une bibliothèque partagée, je suppose que c'est compilé uniquement au même endroit, puis utilisé dans les binaires qui le chargent. Toujours 10x pour le conseil.



5
votes

Selon Politiques KDE / Compatibilité binaire avec C ++ Vous ne pouvez pas le faire sans rupture binaire compatibilité. Toutefois, comme l'indique leur désir de responsabilité, certains des conseils qu'ils donnent dans «Vous ne pouvez pas ...» sont dépendants du compilateur, vous pourriez donc vous échapper avec ce changement (bien que ce ne soit pas très probable).


2 commentaires

+1 pour citer cet article KDE TechBase. C'est certainement la meilleure collection de conseils concernant la compatibilité ABI sur le Web.


@andref, doute que c'est le meilleur; Juste le plus connu, je suppose ;-)