cpu对编程的影响


    由于cpu设计的不同,所以在cpu之间通信的时候有些地方需要注意,常见的主要是字节序和字节对齐问题.


I. 字节序

几乎所有的机器上,多字节对象都被存储为连续的字节序列。

现在有两颗不同架构的cpu芯片, 分别是低有效位被优先存储的cpu1(小端序)和高有效位被优先存储的cpu2(大端序)

内存数据:

0x80480000 0x80480001 0x80480002 0x80480003
0x12 0x34 0x56 0x78

从内存地址0x80480000读取一个字节时,cpu1和cpu2读取的结果都是0x12;

从内存地址0x80480000读取两个字节时,cpu1读取的结果是0x3412,而cpu2读取的结果是0x1234;

这样就产生了所谓的字节序问题,只有读取大于2个字节的时候才会涉及字节序的问题



//简单判断当前机器的字节序
int main(void)
{
    int iNum = 0x04030201;
    char *pcNum = &iNum;
     
    if (*pcNum == 0x04)

        puts("big edum\n");
    else

        puts("small edum\n");
 
    return 0;
}


II. 字节对齐

1. 基本数据类型的自身对齐值

    char --> 1

    short --> 2

    int, float, long --> 4

    double, long long --> 8


2. 结构体或者类的自身对齐值:

    其数据成员中自身对齐值最大的那个值。


3.  数据成员、结构体和类的有效对齐值:

    自身对齐值和指定对齐值中小的那个值。


4. 指定对齐值:

#pragma pack (2)   /* 指定按2字节对齐 */
/* 结构体定义 */
struct C {
    char b;
    int a;
    short c;
};
#pragma pack () /* 取消指定对齐,恢复缺省对齐 */


说明:
* 有效对齐值很重要,是最终用来决定数据存放地址方式的值。有效对齐值为N就表示该数据的存放起始地址%N=0。
* 对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐//补齐
* 对于数组,比如:char a[3];它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
* 如果写: typedef char Array3[3];Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.

* 不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64….中的一个


相关文章推荐   http://blog.csdn.net/liuxingen/article/details/45420455/

你可能感兴趣的:(cpu对编程的影响)