Quais são algumas das técnicas para lidar com segurança com segurança de 32 e 64 bits sem uma macro condicional?
-
20-09-2019 - |
Pergunta
Estou atualizando algum código em uma biblioteca, porque descobri que meu código original assumiu ponteiros de 32 bits. Eu tenho meus próprios pensamentos sobre como corrigi -lo, mas, para rigor, quero perguntar quais são algumas técnicas que você usaria para fazer com que esse código funcione para 32 bits e 64 bits sem uma macro?
char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
sizeof (id *) é 4 em 32 bits, 8 em 64 bits. Estou usando Char *Arglist para construir uma variedade de indicadores para objetos e, em seguida, usando o método GetObjects da NSARRAY:
[myNSArray getObjects:(id *)argList];
funciona em 32 bits, falhas em 64 bits (por razões óbvias)
Solução
Embora eu não tenha todo o contexto, suspeito que isso não seja realmente um problema de 32/64. O que você provavelmente quer é algo parecido com:
id *argList = malloc(sizeof(id) * argumentsCount);
Dependendo da situação, às vezes gosto de alocar blocos de memória assim com a alocação já zero:
id *argList = calloc(1UL, sizeof(id) * argumentsCount);
Ambos alocam um pedaço de memória capaz de segurar argumentsCount
número de ponteiros para objetos. Você pode acessar os ponteiros individuais como assim:
argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);
Quando você declara argList
como um ponteiro para char
digite, como você fez no seu exemplo, indexando elementos individuais (ou seja, argList[0]
, argList[1]
), acessará os bytes individuais da memória alocados para argList
, não as dicas individuais como você provavelmente está esperando. Quando você declara argList
Como id
, como eu fiz no acima, a indexação de elementos individuais passam pela memória alocada para argList
por sizeof(id)
bytes. O compilador compensará automaticamente o tamanho correto do ponteiro para a arquitetura de destino.
Assumindo que o ponteiro retornou por malloc()
é 0x1000
, aqui está uma tabela dos endereços que seriam calculados para o modo de 32 e 64 bits para char *
e id *
declarações:
32-bit: char * id * 64-bit: char * id *
argList[0]: 0x1000 0x1000 0x1000 0x1000
argList[1]: 0x1001 0x1004 0x1001 0x1008
Não tenho ideia de por que isso funcionou para você no modo de 32 bits.
Outras dicas
Por que você está mantendo IDs em uma matriz C em vez de uma das classes de coleta disponíveis na Fundação?