2018-07-10 12:51:01
今天看到三个有意思的宏命令,小记一下:
1、变量大小计算宏:(变量有多少字节)
1 #define mysize_v(x) ((char*)(&x+1) - (char*)(&x))
该宏实现的思想是让指向变量x的指针偏移一个x的大小,然后用偏移后的指针减去原来的指针即可。因为我们知道指针相减是两个指针之间有多少个指针指向的类型的元素,所以该方法可行。但是要注意,我们想要得到的是变量所占的字节数,我们知道char类型只占单位字节所以我们将指向变量的指针类型强制转换成char*,这样就能实现我们所需的功能。
2、类型大小计算宏:(类型有多少字节)
1 #define mysize_t(t) ((size_t)((t*)0+1))
该宏实现的思想是由于类型不像变量那样可以使用指针指向,所以使用一个特殊的位置:0,让0偏移一个大小,再将偏移后的位置用指向所求类型的指针强制转换,这样便得到以0为起始,偏移一个t类型元素的大小,但是此时我们得到的是指针类型,我们需要的是整型,所以将结果强制转换成无符号的整型size_t即可。
3、空间对其宏:(向上对齐)
1 #define ALIGN(v,b) ((v+b-1) & ~(b-1))
注:该宏的作用是使v对齐b,b必须是2的n次方。
该宏实现的思想是使用与运算符的特性:任何数和0相与,结果为0。用此特性来抹除对齐结果中除最高位以外的其他位。