2008-10-03 11 views
1

Tenir compte de ces deux cas, d'en-tête ++ C:La constance du tableau statique affecte-t-elle la disposition de la bibliothèque partagée?

Cas 1:

class Test { 
    public: 
    static int TEST_DATA[]; 
}; 
int Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

Cas n ° 2:

class Test { 
    public: 
    static int const TEST_DATA[]; 
}; 
int const Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

est-const dans ce dernier cas uniquement pour les contrôles de compilation auto-imposées ou ne cela affecte la disposition de la bibliothèque partagée sur Mac/Linux/Windows?

Mise à jour: Selon les réponses, le compilateur peut mettre les choses const sur une page de lecture seule. Est-ce que Visual C++ sur Windows ou GCC sur Mac ou Linux place réellement les données const sur une page en lecture seule? Peut-être que j'ai testé dans le mauvais sens, mais sur Mac sur Intel, les éléments de la version const semblait inscriptible.

Répondre

2

Le compilateur peut mettre les données dans une section différente du binaire selon qu'il est const ou non - c'est entièrement à la discrétion du compilateur.

0

Bien qu'il n'y ait aucune garantie, il est peu probable que le const rompe la compatibilité binaire dans le cas d'un tableau, de sorte que les bibliothèques partagées doivent se retrouver avec la même mise en page.

Notez ce serait probablement pas être le cas pour un seul int:

struct Test 
{ 
    static int const TEST; 
}; 
int const Test::TEST = 7; 

parce TEST est une constante de compilation.

1

Le compilateur (ou, en fait, l'éditeur de liens) pourrait placer le second dans un segment marqué comme étant en lecture seule, pour déclencher une exception matérielle si vous avez essayé d'écrire dessus. Étant donné que l'écriture sur des éléments non destinés à être écrits est un vecteur d'attaques de sécurité, plusieurs systèmes sécurisent leurs données en lecture seule.