J'écris du code qui a beaucoup de variables const (principalement des ints et des énumérations) et je me demande s'il y a un nombre maximum de variables que je peux déclarer ? Mon idée est que ces variables const sont allouées sur la pile, ce qui signifie que je peux déclarer environ 1 Mo/4 octets = 250 000 variables (ce qui est beaucoup), en supposant que la pile a une taille de 1 Mo. Ai-je raison?

Un exemple rapide de ce que je veux dire :

Test.cpp :

const unsigned int VECTOR_ID = 4;
const unsigned int MATRIX_ID = 3;

int main()
{
  std::cout << VECTOR_ID << " : " << MATRIX_ID << std::endl;
  return 0;
}
6
ThatGuyAgain 8 févr. 2020 à 21:25

1 réponse

Meilleure réponse

Notez que les constantes connues au moment de la compilation peuvent ne correspondre à aucun objet ; lorsque vous compilez avec l'optimisation activée, les constantes seront compilées directement dans les instructions machine en tant que valeurs immédiates. Voici un exemple simple. Cela signifie qu'il n'y a pas de limite au nombre de variables constantes en tant que telles. Cela signifie également que les constantes qui ne sont pas du tout utilisées disparaîtront probablement complètement. (Et si ils sont utilisés de manière non triviale, la taille du code dépassera la taille des données.)

Même si effectivement vos variables constantes deviennent des objets, par ex. parce que leur adresse est prise, ils seront "compilés dans votre programme" et feront partie de l'exécutable.

La taille d'un programme et la taille de ses segments sont limitées par le format de l'exécutable, les ressources système et potentiellement par les outils de construction. Une page Intel semble indiquer que des données statiques ( où les constantes globales pourraient se retrouver) est limité à 2 Go sous Windows même sur des architectures 64 bits (ce qui est toujours trois ordres de grandeur plus grand que votre cas d'utilisation) :

Notez que la limite sur les données statiques et de pile est la même dans les variantes 32 bits et 64 bits. Cela est dû au format du type de fichier Windows Portable Executable (PE), qui est utilisé pour décrire les EXE et les DLL tels que définis par l'éditeur de liens. Il a des champs 32 bits pour les décalages et les longueurs des sections d'image et n'a pas été étendu pour les variantes 64 bits de Windows. Comme sur Windows 32 bits, les données statiques et la pile partagent les mêmes premiers 2 Go d'espace d'adressage.

Une recherche rapide a semblé indiquer que cette limite n'est pas présente dans un Linux moderne.

3
Peter - Reinstate Monica 8 févr. 2020 à 21:41