Quais são algumas das técnicas para lidar com segurança com segurança de 32 e 64 bits sem uma macro condicional?

StackOverflow https://stackoverflow.com/questions/1533986

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)

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top