[Edit: je n'ai pas remarqué, au départ, que c'était posté à la fois comme le C et le C++. Je suis en répondant seulement à l'égard de C.]
Pour répondre à votre suivi de la question, "Est-il de toute façon à déterminer la quantité de mémoire allouée à une expression ou une variable au moment de l'exécution?": eh bien, pas exactement. Le problème, c'est que ce n'est pas très bien formé question.
"Expressions", C-à-la-langue (par opposition à certains aspects spécifiques de la mise en œuvre), n'utilisent pas toute la mémoire. (Des implémentations spécifiques au besoin du code et/ou des données de mémoire pour contenir les calculs, en fonction du nombre de résultats de l'ajustement dans les registres du CPU et ainsi de suite.) Si un résultat de l'expression n'est pas planqué dans une variable, il suffit simplement de s'évanouit (et le compilateur peut souvent omettre le code d'exécution pour calculer le jamais-résultat enregistré). La langue ne vous donne pas une façon de demander quelque chose qu'il ne veut pas assumer existe, c'est à dire, l'espace de stockage pour les expressions.
Variables, d'autre part, occupent de stockage (mémoire). La déclaration d'une variable indique au compilateur de combien de stockage à mettre de côté. Sauf pour le C99 est Variable Tableaux de Longueur, bien que, l'espace de stockage requis est déterminé uniquement à compiler temps, pas au moment de l'exécution. C'est pourquoi, sizeof x
est généralement une constante de l'expression: le compilateur peut (et doit) déterminer la valeur de sizeof x
au moment de la compilation.
C99 est VLAs sont une exception particulière à la règle:
void f(int n) {
char buf[n];
...
}
L'espace de stockage requis pour buf
n'est pas (en général) quelque chose, le compilateur peut trouver au moment de la compilation, sizeof buf
n'est pas une constante de compilation. Dans ce cas, buf
fait est attribué au moment de l'exécution et sa taille est seulement déterminé ensuite. Donc, sizeof buf
est un runtime-expression calculée.
Pour la plupart des cas, cependant, tout ce qui est de la taille à l'avant, au moment de la compilation, et si une expression déborde au moment de l'exécution, le comportement est indéfini, la mise en œuvre définies, ou bien définis selon le type. Signé dépassement d'entier, comme dans de 2,5 milliards de dollars multiplié par 2, lors de l' INT_MAX
est juste un peu plus de 2,7 milliards de dollars, les résultats dans "un comportement non défini". Des entiers non signés ne l'arithmétique modulaire et vous permettre ainsi de calculer dans GF(2k).
Si vous voulez faire certain que le calcul ne peut pas déborder, c'est quelque chose que vous devez calculer vous-même, au moment de l'exécution. C'est une grande partie de ce qui rend multiprecision bibliothèques (comme bpf) difficile d'écrire en C-il est généralement beaucoup plus facile, ainsi que plus rapide, le code de grandes parties de l'assemblage et de profiter des propriétés connues de la CPU (comme dépassement de drapeaux, ou le double du résultat étendu-registre-des paires).