1、用一段代码来判断机器是16位还是32位的?
可以使用sizeof计算int的字节长度来判断是32位还是16位。
32位机器下:sizeof(int) = 4;16位机器下:sizeof(int) = 2
二:利用最大值
-
机器位数不同则表示的数字的最大值是不同的。
32位机器下int的最大值为2147483647,16位机器下int的最大值是32767
-
我们可以利用最大值是否溢出情况来判断
定义一个变量num赋值32768,如果是16位机器这个时候超过了int最大值变成了-32768,如果是32位机器不会超过
3、指向变量的指针
1、int p=&a; // 将p指针指向变量a
2、指向数组的指针
int p1[5];
首先,对于语句“intp1[5]”,因为“[]”的优先级要比“”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。
3、数组指针
int (*p2)[5];
对于语句“int(p2)[5]”,“()”的优先级比“[]”高,“”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
3、指向函数的指针
int (p)(int i,int j);
p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。指向函数的指针也称为函数指针
4、内存对齐的优点与内存不对齐的区别
过内存对齐之后,CPU的内存访问速度大大提升。具体原因接下来解释
cpu把内存当成是一块一块的,块的大小可以是2,4,8,16 个字节,因此CPU在读取内存的时候是一块一块进行读取的,块的大小称为(memory granularity)内存读取粒度。
我们再来看看为什么内存不对齐会影响读取速度?
假设CPU要读取一个4字节大小的数据到寄存器中(假设内存读取粒度是4),分两种情况讨论:
1.数据从0字节开始
2.数据从1字节开始
解析:当数据从0字节开始的时候,直接将0-3四个字节完全读取到寄存器,结算完成了。
当数据从1字节开始的时候,问题很复杂,首先先将前4个字节读到寄存器,并再次读取4-7字节的数据进寄存器,接着把0字节,4,6,7字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器,对一个内存未对齐的寄存器进行了这么多额外操作,大大降低了CPU的性能。
5、进程间的通信方式