> > I have code that goes something like this: > > char *foo(char *buf){ > *buf++ = 42; > *((short*)buf) = 0xfeed; > buf += 2; > *((int*)buf) = 0x12345678; > buf += 4; > *((int*)buf) = 0x12345678; > buf += 4; > return buf; > }
This does violate C aliasing rules. Here is how I would write it so you can get the best results: char *foo(char *buf) { short temp; int temp1; *buf++=42; temp = 0xfeed; memcpy(buf, &temp, sizeof(temp)); buf+=sizeof(temp); temp1 = 0x12345678; memcpy(buf, &temp1, sizeof(temp1)); buf+=sizeof(temp1); temp1 = 0x12345678; memcpy(buf, &temp1, sizeof(temp1)); buf+=sizeof(temp1); return buf; } As using memcpy does not cause a violation of the aliasing rules. And does the correct thing: lis 11,0x1234 li 0,42 li 9,-275 ori 11,11,22136 stb 0,0(3) sth 9,1(3) stw 11,7(3) stw 11,3(3) addi 3,3,11 -- Pinski