La plupart des constantes que je vois dans les autres Code sont des pouvoirs de 2, c'est-à-dire ou p> y a-t-il une raison particulière Pourquoi nous faisons cela au lieu de IE P> #define SIZE 257
9 Réponses :
Parce que la mémoire de l'ordinateur fonctionne avec 0/1 qui est un système binaire. P>
Et quelle différence cela fait-il si je fais un tableau de 256 caractères au lieu de 100 caractères?
Ma réponse concerne la façon dont le processeur accède à la mémoire, il est plus facile quand il est 2 ^ n
La mémoire est généralement attribuée dans des multiples de tailles de page à partir du système d'exploitation et, dans de nombreux cas, il est utile d'organiser des choses à adapter les pages exactement (afin de ne pas perdre de mémoire). Cela dépend de la routine d'allocation spécifique, que cela aide vraiment; par exemple. S'il y a une en-tête implicite, la taille d'une puissance de deux peut réellement faire mal. p>
Les pouvoirs de 2 sont pratiques parce qu'ils correspondent bien aux contraintes sous-jacentes dans du matériel. P>
tel que: p>
Pour les drapeaux, les puissances de 2 ont toujours un seul jeu. Donc, des choses comme C'est aussi quelque chose d'une convention à choisir la puissance plus importante de deux pour tailles de tampon et similaires. P> my_flag_1 | My_flag_2 | My_flag_3 | ... code> ne travaille que avec des pouvoirs de deux. De même pour tester des drapeaux avec
& code>. P>
Pas beaucoup de raison vraiment. En raison de l'alignement des variables en structure et sur la pile, une matrice de trois octets prendra probablement 4 ou 8 octets en mémoire. Je pense que ça se sent bien. P>
L'allocation d'un nombre entier de pages du tas peut ne pas fonctionner aussi efficacement que nécessaire en raison de la surcharge de la structure interne du tas. Allocation 4096 octets (1 page pour une machine Windows 32 bits) peut entraîner une allocation de 4104 octets ou plus. P>
Si les constantes sont des drapeaux, l'histoire est très différente. Il est généralement plus efficace d'avoir des drapeaux de bits que des drapeaux dans une base qui n'est pas une puissance de 2. P>
Nos tailles variables sont des pouvoirs de 2 (1, 2, 4 ou 8 octets). L'ordinateur est à l'aise de travailler sur ces limites. Dans l'ancien temps, nous avions l'habitude de poser soigneusement nos structures pour que notre code va aller plus vite, et parfois de rendre le pointeur arithmétique plus facile.
Si vous avez le choix entre une taille de 256 et 257, nous allons avec 256. une raison serait pour le débogage. Lorsque vous examinez la mémoire ou dans un fichier, votre visualiseur de débogueur ou de votre fichier hexader affichera les données dans des lignes qui sont une puissance de deux. P>
Voici un indiquant 16 octets par ligne, en groupes de 4.
Pour les drapeaux, nous les faisons les pouvoirs de deux afin que nous puissions les traiter séparément dans une variable au lieu de nombreuses variables ou une matrice. P> afin qu'ils puissent tous être ou à partir de la même variable. P>
(source: wikimedia.org ) sub> p> bits |= 8; //00000100
bits |= 32; //00010000
//bits is now 40 00010100
bits &= 32; //00010000
//bits is now 32 00010000
avec des ordinateurs binaires, il est pratique d'utiliser multiples binaires comme
Ajout d'autres bits à une puce de mémoire se fait généralement en quadruplant le nombre de "cellules" sur la puce. Deux fois plus large, deux fois plus long, quatre fois la mémoire (à l'exception des distances plus petites entre les "cellules"). P>
De plus, il est plus facile de multiplier à l'aide d'un seul décalage plutôt que de l'algorithme de mulplication générique d'ajout de décalages successifs en fonction de si un bit particulier est défini ou non. OpenGL était célèbre pour avoir exiger de la puissance de deux tailles pour les textures d'accéder à des lignes de numérisation particulières. P>
En ce qui concerne la taille des matrices, je suppose qu'il y a deux raisons pour lesquelles des pouvoirs de deux sont favorisés. L'une - comme en témoigne plusieurs réponses ici - est que les programmeurs qui ne savent pas ce qui se passe "sous la hotte" semble avoir un sens général qu'il pourrait être plus efficace d'utiliser une puissance de deux. L'autre est (principalement historique maintenant) à faire avec des tampons cycliques.
Les tampons cycliques qui sont des pouvoirs de deux peuvent être traités plus facilement et plus rapidement à l'aide de masques peuvent sur les indices de lecture et d'écriture plutôt que de l'utiliser normalement plus lent. opération modulo ou en utilisant des conditions nécessitant des succursales. C'était crucial sur des machines plus anciennes mais peut toujours être important pour transférer de grandes quantités de données - par exemple. Traitement graphique p>
Par exemple, en C, le nombre d'octets disponibles à lire dans un tampon cyclique peut être obtenu par: p> si non Utilisation de la puissance de deux alors l'équivalent serait: p> sur des machines qui ne mettent pas en œuvre une instruction Division / Modulus que peu "%" pourrait prendre plusieurs centaines de cycles, alors vous aurait besoin de quelque chose comme: p> qui claque le code et provoque la ramification qui peut staller le pipeline d'instructions. P> écrire sur le tampon qui était quelque chose comme < / p> devient le (généralement) plus efficace: p> bien sûr si vous avez utilisé une variable de 8 bits non signée pour indexer un 256 Array d'entrée Ensuite, vous n'avez même pas besoin de faire le masquage. P> p>
Bon point. Je pense toujours au langage de l'assemblage, et faites des tampons circulaires avec et. Lorsque je construis une table de trigle, je le construit avec 256 "degrés" afin que je puisse examiner juste l'octet inférieur après une addition ou une soustraction.
Je ne pense pas que cette question puisse être répondue sans savoir quelle est la constante utilisée. Le but de la constante est ce qui définit les valeurs que la constante peut supposer.
Un exemple pourrait être la taille d'un éventail d'INTS.
Je pense que vous pensez que nous utilisons des pouvoirs de 2 de plus que ce qu'ils sont réellement utilisés. Les gens utiliseront un éventail de 100 INTS identique à celui d'un tableau de 256. Bitmasking est la principale raison des pouvoirs de 2 et ne s'applique pas aux tailles de matrices.
Je suis d'accord, quelle est la constante utilisée pour. Je vois aussi un ensemble constant à 3.1416, ou 2.7183. Ce qui ne sont évidemment pas base 2. mais PI et E des mathématiques. La plupart des autres constantes sont utilisées en fonction de la manière dont la mémoire est attribuée aux pouvoirs de 2. Ce qui peut être ce que vous voyez.
Pour être honnête, je n'ai jamais vu de constante définie à 3.1416 ... à l'exception de π elle-même. ;)