int always 32 bits on all platforms?
AJ
aj at nospam.net
Thu Oct 22 03:00:31 PDT 2009
"KennyTM~" <kennytm at gmail.com> wrote in message
news:hbp924$24ht$1 at digitalmars.com...
> On Oct 22, 09 17:31, AJ wrote:
>> "Nick Sabalausky"<a at a.a> wrote in message
>> news:hboui3$1bbt$1 at digitalmars.com...
>>> "AJ"<aj at nospam.net> wrote in message
>>> news:hbor97$155c$1 at digitalmars.com...
>>>>
>>>> "Nick Sabalausky"<a at a.a> wrote in message
>>>> news:hbonj3$u34$1 at digitalmars.com...
>>>>> "AJ"<aj at nospam.net> wrote in message
>>>>> news:hboa9p$5md$1 at digitalmars.com...
>>>>>>
>>>>>> How do you make ABC below work on a platform that requires 32-bit
>>>>>> integers to be aligned on 32-bit boundaries while keeping the layount
>>>>>> and size of ABC the same as on a platform that has no such alignment
>>>>>> requirement?
>>>>>>
>>>>>> struct ABC
>>>>>> {
>>>>>> byte a;
>>>>>> int b; // may be improperly aligned on some platforms
>>>>>> int64 c; // same issue
>>>>>> };
>>>>>>
>>>>>>
>>>>>
>>>>> It can be done by using bitmasks and bit shifting on every access.
>>>>>
>>>>
>>>> I had a feeling I was delving into "dangerous territory" (read, way too
>>>> low level for me, but I wonder what the possibilities are). I have a
>>>> feeling that I may be wanting hardware standardization because it can't
>>>> be "solved" at the language level (?).
>>>>
>>>> I don't understand how using bitmasks and bit shifting on every access
>>>> would work
>>>
>>> Normally, the compiler would turn this:
>>>
>>> myabc1.b = myabc2.b + 1;
>>>
>>> Into something like this:
>>>
>>> - move value at memory address xxxxx (myabc2.b) into cpu register
>>> - add 1
>>> - move value in cpu register into memory address xxxxx (myabc1.b)
>>>
>>> If the compiler knows that myabc1.b and myabc2.b are not aligned in a
>>> way
>>> that the cpu can directly access, then what it would turn it into is
>>> something like:
>>>
>>> - move the values at the two memory addresses that myabc2.b straddles
>>> into
>>> cpu registers
>>> - use bit manipulation tricks to throw away myabc2.a and myabc2.c and
>>> compine the two parts of myabc2.b
>>> - add 1
>>> - use bit manipulation tricks to split the value in the cpu register
>>> back
>>> into two parts, and mix in myabc1.a and myabc1.c
>>> - move the restulting values into the memory addresses that myabc1.b
>>> straddles
>>
>> OK, thanks.
>>
>>>
>>>> the plausibility of it
>>>
>>> It should always possible. Although references to the struct's members
>>> would probably be very tricky and require a lot of extra fancy work.
>>
>> I should have used 'practicality' instead of 'plausibility'. So maybe not
>> so
>> practical (unless the concept is a real boon). (No, I don't know what a
>> "boon" is either ;) ).
>>
>>>
>>>> and the cost (in execution time) of doing so.
>>>
>>> Depends completely on the cpu, of course. In general though, it's quite
>>> a
>>> bit slower (a single fetch or store turns into at least two
>>> fetches/stores
>>> plus some bitmasking and shifting, maybe uses up extra registers, and
>>> would make less of the code fit in cache). But that's the price you pay
>>> for using packed structs like that on such a CPU. Or you could just use
>>> align(4) to guarantee 32-bit alignment on all fields for all cpus.
>>
>> Yes, surely that is the way to go. Or... craft structs to align nicely in
>> the first place and make the decision on which CPUs you want one set of
>> code
>> to run on:
>>
>> struct ABC
>> {
>> byte a;
>> byte pad1;
>> byte pad2;
>> byte pad3;
>> int b; // may be improperly aligned on some platforms
>> int64 c; // same issue
>> }
>>
>>
>
> If data offset is really that important, you should use a bitfield.
?
More information about the Digitalmars-d
mailing list