2010-08-13 10 views
0

Est-ce que cela fait une différence si j'utilise par ex. short ou char type de variable au lieu de int en tant qu'initialisateur de boucle for?Itérer avec différents types d'intégrale

for (int i = 0; i < 10; ++i) {} 

for (short i = 0; i < 10; ++i) {} 

for (char i = 0; i < 10; ++i) {} 

Ou peut-être qu'il n'y a pas de différence? Peut-être que je rends les choses encore pire et l'efficacité diminue? Est-ce que l'utilisation d'un type différent économise de la mémoire et augmente la vitesse? Je ne suis pas sûr, mais je suppose que l'opérateur ++ peut avoir besoin d'élargir le type, et par conséquent: ralentir l'exécution.

+0

Dans quelle langue? Sur quelle plateforme? – Oded

+0

C/C++/Java/C#, cela ne me dérange pas, à la fois les machines virtuelles et les architectures non virtuelles et différentes. –

Répondre

1

Cela ne fera aucune différence que vous devriez vous en soucier, à condition que la gamme que vous itérez sur vous soit adaptée au type que vous choisissez. Au niveau des performances, vous obtiendrez probablement les meilleurs résultats lorsque la taille de la variable d'itération est la même que la taille de l'entier natif de la plateforme, mais tout compilateur décent l'optimisera pour l'utiliser quand même. Sur une plate-forme gérée (par exemple C# ou Java), vous ne connaissez pas la plate-forme cible au moment de la compilation, et le compilateur JIT est essentiellement libre d'optimiser quelle que soit la plateforme sur laquelle il s'exécute. La seule chose que vous pourriez vouloir faire attention est lorsque vous utilisez le compteur de boucle pour d'autres choses à l'intérieur de la boucle; changer le type peut changer la façon dont ces choses sont exécutées, jusqu'au point (en C++ au moins) qu'une surcharge différente pour une fonction ou une méthode puisse être appelée parce que la variable de boucle a un type différent. Un exemple serait lorsque vous produisez la variable de boucle via un flux C++, comme ceci: cout << i << endl;. De même, le type de la variable de boucle peut infester les types implicites de (sous-) expressions qui le contiennent et conduire à des dépassements de capacité cachés dans les calculs numériques, par exemple: int j = i * i;.

+0

MarcAndreson: Ne pas oublier les types non signés par rapport aux types signés –