读书人

有人帮小弟我解释一下这个宏的意思吗

发布时间: 2012-03-28 15:40:03 作者: rapoo

有人帮我解释一下这个宏的意思吗?
// Align value 'x ' to boundary 'b ' which should be power of 2
#define DOALIGN(x,b) (((x) + (b) - 1) & ~((b) - 1))

[解决办法]
就是将x对齐到下个2^b边界,比如4字节对齐b=2
举个例子
x=13
b=2
那么DOALIGN返回16
[解决办法]
帮顶,不知道干嘛
[解决办法]
如果你看C/C++编译器生成的汇编代码的话,就会常遇到对齐的概念,对齐主要是为了提高程序的执行效率

http://en.wikipedia.org/wiki/Data_structure_alignment
[解决办法]
mark
[解决办法]
mark
[解决办法]
'b ' which should be power of 2
==========
b=16/32/64
[解决办法]
x 的最高位置1其0
然後反回果
[解决办法]
~ 非
& 与

用二进制来算
[解决办法]
计算机在读写内存时以字长为单位,现在多数PC机是32bit的,
也就是说要么不读不写,要么一次就读写4个字节长度的内存,
这样内存就按字长分成一段一段的格子,每一个格子看作一个整体。

程序中定义的变量代表的是一段有开始地址和确定长度的内存,
如果某个变量长度只有2个字节,但是它占用了两个格子,
那么程序在访问这个变量时,就要读写两次!(很多变量访问积累的效率很低)
对齐的含义可以理解成该变量的开始地址恰好在格子的开始处。

你所给出的宏,调试好像不符合预期结合!
[解决办法]
哎,也是看不懂~!~!
[解决办法]
计算 & ~ 时,把十进制转化成二进制,按位运算,

程序中遇见(x,b) 直接替代成 (((x) + (b) - 1) & ~((b) - 1)) 计算即可

[解决办法]
计算 & ~ 时,把十进制转化成二进制,按位运算,

程序中遇见DOALIGN(x,b) 直接替代成 (((x) + (b) - 1) & ~((b) - 1)) 计算即可


[解决办法]
// Align value 'x ' to boundary 'b ' which should be power of 2
貌似上面的注释就是这个宏的准确说明啊……

具体就是uwinb说的原因了,应该是优化方法的一种吧……
----------------------------
计算机在读写内存时以字长为单位,现在多数PC机是32bit的,
也就是说要么不读不写,要么一次就读写4个字节长度的内存,
这样内存就按字长分成一段一段的格子,每一个格子看作一个整体。

程序中定义的变量代表的是一段有开始地址和确定长度的内存,
如果某个变量长度只有2个字节,但是它占用了两个格子,
那么程序在访问这个变量时,就要读写两次!(很多变量访问积累的效率很低)
对齐的含义可以理解成该变量的开始地址恰好在格子的开始处。
[解决办法]
uwinb所说的 "对齐 ",是一个编译器行为,不是一个表达式所能完成的行为.
虽然可以在代码中改变编译器的 "对齐 "大小,比如从默认的8字节,改为4字节或者1字节,但那是通过更改编译器设置的命令,不是一个表达式.

这个宏的作用,不能光看那行注释.请楼主带提供使用这个宏的代码...
[解决办法]
举个例子
x=13
b=2
那么DOALIGN返回14

在VC6.0下是14


这个宏返回值
if(x % b == 0)
{
返回值 = x
}
else
{
返回值 = 比X大的最小的b的整倍数。
比13 大的最小 2 的整倍 数是 14
}



[解决办法]
唉b的值是b=16/32/64

linux kernel常出的代

------解决方案--------------------


卡初始化net_device的源函面的一部分就是子
[解决办法]
其中b的值应该是
2 10
4 100
8 1000
16 10000
32 100000

#define DOALIGN(x,b) (((x) + (b) - 1) & ~((b) - 1))
为什么必须是这样的数。
把实际值代进去看一下,就会明白。
还拿上面的例子:
DOALIGN(13,2)

~((b) - 1)=~(1)=0xfffffffe=11111111111111111111111111111110b
看到这能想到什么吗?
摆明了,是要某个数&一下。并且只要高31位的数据,低一位的不要。
假如b是4
~((b) - 1)=~(3)=0xFFFFFFFC=11111111111111111111111111111100b
只要高32位,低2位的不要。
16,32的都是这个道理。

再来看看前面的数。
((x) + (b) - 1) =(13 + 2 - 1)
要下班了,回家再写



[解决办法]
((x) + (b) - 1) =(13 + 2 - 1)=(13 + 0x1)=(1101b + 00000000000000000000000000000001b)
后面的这串00000000000000000000000000000001b,
当b = 4时 00000000000000000000000000000011b,
当b = 8时 00000000000000000000000000000111b,
这些数的特点是只要后面加任何数都会进1.
13 1101b
14 1110b
15 1111b
其中14是2的倍数,它的最后一位是0,其它的数在与00000000000000000000000000000001b相加时,都会进位。
结果再与& ~((b) - 1))运算,
结果就会是2的倍数。(二进制数最后一位是0)


也不知道,自己说明白了没有。
挣点分,真不容易呀!
[解决办法]
就是将a向上取到最靠近的2的b次幂的一个数


读书人网 >C语言

热点推荐