VS C ++ 2008上的对齐方式

时间:2012-07-05 06:25:59

标签: c++ alignment

通常,short变量必须是2字节对齐地址,但如果我尝试将其指向奇数地址,是否有任何问题?

我在VC ++ 2008上尝试这个代码并运行正常,你能解释一下原因吗?

    unsigned char ca[10];
    unsigned short *s1 = 0;
    memset(ca, 1, 10);

    s1 = (unsigned short*)&ca[0];
    printf("s1 = %d\n", *s1);
    s1 = (unsigned short*)&ca[1];
    printf("s1 = %d\n", *s1);

在上面的代码段中,ca[0]ca[1]肯定有一个奇数地址,因此它不是2字节对齐,但s1完全分配给ca[0] {1}}和ca[1]

这段代码是否符合预期,是否建议以这种方式进行?我想有一个可移植的方法,它将字节数组中的任意两个字节读作一个短变量,以便在几乎所有平台/编译器中都能很好地工作。

非常感谢。

1 个答案:

答案 0 :(得分:4)

没有“必须”,它只是CPU能够或不能做的事情。特别是x86可能会进行“错位”访问,尽管它几乎肯定效率较低。

其他CPU架构的可移植性可能是您可能关心的,也可能不是,但通常应该避免错位的内存访问。另外,你几乎不得不欺骗编译器甚至让你做错位的东西......就像你乞求它“请,拜托,拜托,但我真的想要自己拍脚,请让我这样做”';这通常不是你可以意外做的事情。