10
votes

Pourquoi déclarons-nous toujours des constantes d'être des pouvoirs de 2?

La plupart des constantes que je vois dans les autres Code sont des pouvoirs de 2, c'est-à-dire xxx pré>

ou p> xxx pré>

y a-t-il une raison particulière Pourquoi nous faisons cela au lieu de IE P>

#define SIZE 257


5 commentaires

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. ;)


9 Réponses :


-2
votes

Parce que la mémoire de l'ordinateur fonctionne avec 0/1 qui est un système binaire.


2 commentaires

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




4
votes

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.


0 commentaires

29
votes

Les pouvoirs de 2 sont pratiques parce qu'ils correspondent bien aux contraintes sous-jacentes dans du matériel.

tel que:

  1. Taille de la page
  2. Limites d'espace d'adresses
  3. alignement des consistitions (dword ou qword alignement en général, les deux puissances de 2)

    Pour les drapeaux, les puissances de 2 ont toujours un seul jeu. Donc, des choses comme my_flag_1 | My_flag_2 | My_flag_3 | ... ne travaille que avec des pouvoirs de deux. De même pour tester des drapeaux avec & .

    C'est aussi quelque chose d'une convention à choisir la puissance plus importante de deux pour tailles de tampon et similaires.


0 commentaires

1
votes

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.

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.

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.


0 commentaires


1
votes

avec des ordinateurs binaires, il est pratique d'utiliser multiples binaires comme Mebibyte (ou Kibi, Gibi, Tebi ...). Ces 2 chiffres ont également l'air bien dans OCTAL ou heex notations.


0 commentaires

1
votes

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").

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.


0 commentaires

2
votes

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

Par exemple, en C, le nombre d'octets disponibles à lire dans un tampon cyclique peut être obtenu par: xxx

si non Utilisation de la puissance de deux alors l'équivalent serait: xxx

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: xxx

qui claque le code et provoque la ramification qui peut staller le pipeline d'instructions.

écrire sur le tampon qui était quelque chose comme < / p> xxx

devient le (généralement) plus efficace: xxx

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.


1 commentaires

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.