当前位置: 技术问答>linux和unix
关于遇到的Linux中的一些对齐宏到底有什么用呢
来源: 互联网 发布时间:2017-03-07
本文导语: 最近看netlink,发现里面定义了一些对齐宏,通常都是每个结构体定义了对应的一组宏,比如: struct rtattr结构体定义了一组宏: #define RTA_ALIGNTO 4 #define RTA_ALIGN(len) (((LEN)+RTA_ALIGNTO-1)&~(RTA_ALIGNTO-1)) #define RTA_LENGTH(len)...
最近看netlink,发现里面定义了一些对齐宏,通常都是每个结构体定义了对应的一组宏,比如:
struct rtattr结构体定义了一组宏:
#define RTA_ALIGNTO 4
#define RTA_ALIGN(len) (((LEN)+RTA_ALIGNTO-1)&~(RTA_ALIGNTO-1))
#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr))+(len))
#define RTA_OK ...
#define RTA_NEXT ...
等等
这些宏的用法和确切含义我也知道,但是不知道为什么要用它?
比如RTA_ALIGN返回一个大于等于len且能被4整除的数,为什么要把传给它的结构体的长度转化成一个能被4整除的数呢?
如果说RTA_ALIGN宏的参数是个地址,那还能理解,把该地址转成4字节对齐。
同样,struct nlmsghdr结构体也有一组对应的宏。
为什么每个结构体后面跟着的数据都要放在 把该结构体长度转化为能被4整除的地方,而我调用recv收到的每个消息的第一个结构体并没有按4对齐,因为我传递的char数组。
struct rtattr结构体定义了一组宏:
#define RTA_ALIGNTO 4
#define RTA_ALIGN(len) (((LEN)+RTA_ALIGNTO-1)&~(RTA_ALIGNTO-1))
#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr))+(len))
#define RTA_OK ...
#define RTA_NEXT ...
等等
这些宏的用法和确切含义我也知道,但是不知道为什么要用它?
比如RTA_ALIGN返回一个大于等于len且能被4整除的数,为什么要把传给它的结构体的长度转化成一个能被4整除的数呢?
如果说RTA_ALIGN宏的参数是个地址,那还能理解,把该地址转成4字节对齐。
同样,struct nlmsghdr结构体也有一组对应的宏。
为什么每个结构体后面跟着的数据都要放在 把该结构体长度转化为能被4整除的地方,而我调用recv收到的每个消息的第一个结构体并没有按4对齐,因为我传递的char数组。
|
为了获取更好的性能吧。
内存是由一个一个的内存单元组成的,
不对齐的数据,可能刚好跨过两个内存单元的边界,这样访问的时候,硬件就就需要访问两个内存单元的数据才能得到这个结构的内容,就慢了。典型的还会导致cache命中率地下,影响性能,应该这x86这些硬件底下的实现细节有关。 不过可以知道的事实是不对齐影响是比较大的,所以大家才这么搞了。一般来说编译器是会自己会对齐优化结构的,但这些都是直接放到网络包里面去的,偏移容易偏好,他定义这些宏可能是为了控制更好吧。
内存是由一个一个的内存单元组成的,
不对齐的数据,可能刚好跨过两个内存单元的边界,这样访问的时候,硬件就就需要访问两个内存单元的数据才能得到这个结构的内容,就慢了。典型的还会导致cache命中率地下,影响性能,应该这x86这些硬件底下的实现细节有关。 不过可以知道的事实是不对齐影响是比较大的,所以大家才这么搞了。一般来说编译器是会自己会对齐优化结构的,但这些都是直接放到网络包里面去的,偏移容易偏好,他定义这些宏可能是为了控制更好吧。