欢迎来到陈宇翔的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

c++学习笔记

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。用此特性来抹除对齐结果中除最高位以外的其他位。

posted on 2018-07-10 13:14  紫翼之狮  阅读(128)  评论(0编辑  收藏  举报

导航