On 02/19/12 17:23, Manu wrote: > On 19 February 2012 18:03, Vladimir Panteleev <vladi...@thecybershadow.net > <mailto:vladi...@thecybershadow.net>> wrote: > > On Sunday, 19 February 2012 at 15:26:27 UTC, Manu wrote: > > There is code that assumes size_t is the width of the pointer > > > When is this not true? I can only think of 16-bit far pointers. > > > Ignoring small embedded systems (for which it is almost always true), some > that immediately come to mind: > > NaCl (Google Native Client) - x64 arch, 32bit pointers ... <- of immediate > concern to me > PPC based consoles; PS3, X360, Wii, WiiU (not released yet) - 64bit, all > 32bit pointers > Android, and probably iOS; 64bit ARM chips - will certainly not fork the OS > to use 64bit pointers
not to mention linux - x32 (https://sites.google.com/site/x32abi/) But 'size_t' is the size of an object -- so sizeof(size_t)==sizeof(void*) is a pretty safe assumption. It would be a bit hard to work with objects that are larger than the address space covered by the pointer... Is any of the above platforms using segmentation tricks and is sizeof(char*-char*)>sizeof(char*)? I think you mean "native_int" - something that D is missing. On 02/19/12 19:07, Timon Gehr wrote: > Under which circumstances is it important to have a distinct type that > denotes the register size? What kind of code requires such a type? It is > unportable. eg any time you don't want to artificially restrict the size to less than the native one, not use a type wider than the hw efficiently handles or need C compatibility. Yes, you can use 'static if' and 'version' tricks, but that's inconvenient and often obfuscates the code, so you end up reinventing c_int/c_long... And that's not ideal either; having the right types [1] always predefined would be much better. On 02/19/12 18:26, Stewart Gordon wrote: > If you want to know the size of an int, you would just use int.sizeof. > Problem solved. Exactly. Except doing this for D's int would be kind of pointless, wouldn't it?... With a native_int type you *can* write generic code and switch on native_int.sizeof. artur [1] ie a signed/unsigned int that is large as the CPU registers allow. [2] [2] and note that using anything smaller can result in performance degradation, if the values need to be converted to a full-width format.