2009-06-16 14 views
0

Supposons que je dispose d'un tableau de taille 78719476736 octets. gardez à l'esprit que ce tableau est alloué dynamiquement en utilisant malloc dans mon code C. Supposons que malloc renvoie un pointeur valide après avoir alloué autant de mémoire. La taille de ce tableau est supérieure à UINT_MAX (4294967295), c'est-à-dire limite maximale d'un entier non signé (32 bits)Accès à la mémoire supérieure à UINT_MAX * 4 en C?

Supposons que mon code ressemble à quelque chose ci-dessous.

int *buf; 
buf = (int*)malloc(78719476736); 

Ici 78719476736 est supérieur à 4 * UINT_MAX. Maintenant, si je dois me référer à tous les éléments de buf, puisque buf est int *, il sera 32 bits, donc il ne sera pas capable d'adresser tous les éléments de mémoire que j'ai alloués en utilisant malloc (78719476736 octets). Ma question est que le code ci-dessus ne devrait pas être modifié pour rendre buf aussi long (variable de 64 bits) car seule une longue variable longue sera capable d'adresser la grande mémoire que j'ai allouée.

Code changé par ex.

unsigned long long int buf; 
buf = (unsigned long long int*)malloc(78719476736); 

En fait, je pense, la variable buf ne devrait pas être un pointeur plus que tout pointeur va être 32 bits de large et par conséquent, il ne sera pas en mesure d'accéder 78719476736 octets.

Il devrait donc être un entier long non signé et je devrai convertir la valeur du pointeur de retour malloc en un entier long non signé comme indiqué dans le code modifié ci-dessus et utiliser buf pour accéder à tous les éléments alloués.

Suis-je correct dans mes hypothèses ci-dessus?

ou

Suis-je quelque chose confus/manquant?

EDIT: Si elle aide,

Je travaille sur un bureau ayant sur un Windows XP Intel Core 2 Duo (CPU 64 bits). Donc, CPU sage, il ne devrait pas être un problème d'accès à plus de 4 Go d'espace d'adressage. Ce que tous les autres composants doivent être activés pour le support 64 bits, à savoir

a.) Comment puis-je activer le support du compilateur 64 bits lors de la compilation (je suis en utilisant Visual Studio 2005 Professional Edition)

b.) Support du système d'exploitation pour 64 bits - J'utilise Windows XP Professionnel.

Merci.

-AD.

+0

S'il vous plaît me dire ce que le diable vous écrivez pour que je ne causer inadvertantly vous malloc 73Go sur mon serveur ... Pourquoi – Eric

+0

73GB dans un grand tronçon? – dalle

Répondre

7
  1. Vous avez besoin de 64 bits OS
  2. recieves malloc size_t paramètre qui est 64 bits sur 64 plates-formes de bits
  3. Et le plus important: Vous devriez prorbably penser: Ai-je besoin d'allouer plus de 4G de la mémoire?
1

Pour traiter plus de 4 Go de mémoire, vous avez besoin d'un mécanisme de sélection de cette mémoire. Par conséquent, vous devez compiler votre application à 64 bits, puis tous vos pointeurs auront une largeur de 64 bits.La seule autre façon d'accéder à plus de 4 Go de mémoire serait d'utiliser un mécanisme de sélection d'adresse/mémoire supplémentaire, un peu comme avec le segment et le désordre de décalage dans les jours DOS en mode réel. Cela dépend bien sûr de l'architecture de votre processeur.

1

Si vous exécutez votre logiciel sur un Os 64 bits et utilisez les paramètres du compilateur 64 bits, tous vos pointeurs seront 64 bits. Pas besoin d'une déclaration spéciale.

3

Un int* est un type de pointeur. Si vous utilisez un système capable d'allouer 78719476736 octets, il a probablement au moins 64 bits, c'est-à-dire sizeof(int*) >= 8. La taille du pointeur n'a rien à voir avec sizeof(int).

5

Je pense que vous êtes profondément confus au sujet de ce qu'est un pointeur. Sur les systèmes communs au moins, la taille d'un pointeur (le nombre de valeurs différentes, c'est-à-dire le nombre d'adresses différentes) est indépendant du type!

int *a; 
short *b; 
double *c; 

a, b et c sont des pointeurs vers des types différents, mais ils ont tous la même taille (4 octets sur un système 32 bits, par exemple). C'est exactement le point d'un système 64 bits comparé à 32 bits: pour pouvoir adresser plus de 2 ** 32 emplacements à partir d'un pointeur.

En outre, une unité centrale de traitement de 32 bits ne peut pas traiter plus de 4 Gb dans le matériel [1], et l'espace d'adressage virtuel correspondant est également généralement limité à 32 bits. Donc, 8 Go de mémoire est très peu susceptible de fonctionner de toute façon.

[1] ce n'est pas tout à fait vrai - les processeurs Intel par exemple, ont des extensions de sorte qu'une CPU 32 bits peut utiliser des adresses «étendues».