Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can one obtain the sizeof a type for which one has an encoding?

Given an Objective-C type type, one can obtain the encoding encoding and size size of the type easily:

const char *encoding = @encode(type);
size_t size = sizeof(type);

Put a little differently, we have mappings

@encode: type_t -> const char *
sizeof:  type_t -> size_t

This raises two questions:

(1) Suppose that rather than having a type, we have only an encoding. It would be nice to obtain a mapping

sizeofencodedtype: const char * -> size_t

such that for every type_t type we have that

sizeofencodedtype(@encode(type)) = sizeof(type)

Does such a function already exist? If not, how might one go about building one?

(2) Ideally we could invert the @encode mapping to make a mapping

decode: const char * -> type_t

but this doesn't seem to be possible since type_t isn't a real C type. I guess I could wait for @decode to be added to the language, but that's not very realistic or time-sensitive. But should it not be possible to instantiate a type at runtime using its encoding?

References: Objective-C Runtime Programming Guide - Type Encodings

like image 776
Nate Chandler Avatar asked Nov 26 '11 21:11

Nate Chandler


1 Answers

NSGetSizeAndAlignment() can do this for you. It's also a useful function if you're trying to grope through multiple types in the same string.

like image 79
Justin Spahr-Summers Avatar answered Sep 24 '22 15:09

Justin Spahr-Summers