Quelles sont quelques techniques pour gérer en toute sécurité les deux pointeurs 32bits et 64bits sans une macro conditionnelle?
-
20-09-2019 - |
Question
Je mise à jour du code dans une bibliothèque parce que je l'ai découvert mon code d'origine pointeurs 32 bits pris en charge. J'ai mes reflexions sur la façon de le fixer, mais la rigueur, je veux demander quelles sont les techniques que vous utilisez pour faire fonctionner ce code pour 32 bits et 64 bits sans macro?
char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
sizeof (id *) est de 4 à 32 bits, 8 à 64 bits. J'utilise char * argList pour construire un tableau de pointeurs vers des objets, puis en utilisant la méthode getObjects de NSArray:
[myNSArray getObjects:(id *)argList];
fonctionne en 32 bits, les accidents dans 64bit (pour des raisons évidentes)
La solution
Bien que je n'ai pas tout le contexte, je pense que ce n'est pas vraiment un problème de 32/64 bits. Ce que vous voulez sans doute quelque chose le long des lignes de:
id *argList = malloc(sizeof(id) * argumentsCount);
En fonction de la situation, j'aime parfois allouer des blocs de mémoire comme celui-ci avec l'allocation déjà zero'd sur:
id *argList = calloc(1UL, sizeof(id) * argumentsCount);
Ces deux allouent une partie de la mémoire capable de contenir le numéro de argumentsCount
de pointeurs vers des objets. Vous pouvez accéder aux pointeurs individuels comme ceci:
argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);
Lorsque vous déclarez argList
comme pointeur vers char
type que vous avez fait dans votre exemple, l'indexation des éléments individuels (c.-à-argList[0]
, argList[1]
), accèdera aux octets individuels de la mémoire allouée pour argList
, pas les pointeurs individuels que vous êtes probablement attendre. Lorsque vous déclarez argList
comme id
, comme je l'ai fait dans ce qui précède, l'indexation des éléments individuels étapes à travers la mémoire allouée pour argList
par des octets sizeof(id)
. Le compilateur compensera automatiquement la taille du pointeur correct pour l'architecture cible.
Si l'on suppose que le pointeur retourné par malloc()
est 0x1000
, voici une table des adresses qui seraient calculées pour le mode 32 et 64 bits pour les déclarations de char *
et id *
:
32-bit: char * id * 64-bit: char * id *
argList[0]: 0x1000 0x1000 0x1000 0x1000
argList[1]: 0x1001 0x1004 0x1001 0x1008
Je ne sais pas pourquoi cela vous a déjà travaillé en mode 32 bits.
Autres conseils
Pourquoi gardez-vous ids dans un tableau C au lieu de l'une des classes de collection disponibles dans la Fondation?