On Sun, 31 May 2009 23:11:57 +0300, grauzone <[email protected]> wrote:

>> 3) It's very rare in practice that the only pointer to your object  
>> (which you still plan to access later) to be stored in a  
>> void[]-allocated array! Remember, the properties of memory regions are  
>> determined when the memory is allocated, so casting an array of  
>> structures to a void[] will not lose you that reference. You'd need to  
>> move your pointer to a void[]-array (which you need to allocate  
>> explicitly or, for example, concatenating your reference to the  
>> void[]), then drop the reference to your original structure, for this  
>> to happen.
>
> void[] = can contain pointers
> ubyte[] = can not contain pointers
>
> void[] just wraps void*, which is a low level type and can contain  
> anything. Because of that, the conservative GC needs to scan it for  
> pointers. ubyte[], on the other hand, contains sequences of 8 bit  
> integers. For untyped binary data, ubyte[] is the most correct type.
>
> You want to send it over network or write it into a file? Use ubyte[].  
> The data will never contain any pointers. You want to play low level  
> tricks, that involve copying around arbitrary memory contents (like  
> boxing, see std.boxer)? Use void[].

std.boxer is actually a valid counter-example for my post.
The specific fix is simple: replace the void[] with void*[].
The generic "fix" is just to add a line to 
http://www.digitalmars.com/d/garbage.html adding that hiding your only 
reference in a void[] results in undefined behavior. I don't think this should 
be an inconvenience to any projects?

> You shouldn't cast structs or any other types to ubyte[], because the  
> memory representation of those type is highly platform specific. Structs  
> can contain padding, integers are endian dependend... If you want to  
> convert these to binary data, write a marshaller. You _never_ want to do  
> direct casts, because they're simply unportable. If you do the cast, you  
> have to know what you're doing.

Thanks for the advice, but I actually know what I'm doing. Unlike C, D's 
structure alignment rules are actually part of the specification. If I wanted 
my programs to be safe/cross-platform/etc. regardless of execution speed, I'd 
use a scripting or VM-ed language.

-- 
Best regards,
 Vladimir                          mailto:[email protected]

Reply via email to