一个实现内存对齐的宏(太深奥了,看不懂,高手进)

thinkperson_x201 2013-09-06 01:14:39
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))

下面是高人的注释,但我看不懂:
对于a,传入cpu的二级cache的Line大小,通过ngx_cpuinfo函数,可以获取ngx_cacheline_size的大小,一般intel为64或者128。
计算宏ngx_align(1,64)=64,只要输入的d<64,则结果总为64,如果输入的d=65,则结果为128,以此类推。
进行内存池管理的时候,对于小于64字节的内存,给分配64字节,使之总是cpu二级缓存读写行的大小倍数,从而有利于cpu二级缓存的存取速度和效率。

哪位高人帮我详细解释一下这个宏具体是怎样实现内存对齐的?最好有图形说明。
...全文
776 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkperson_t410 2015-01-10
  • 打赏
  • 举报
回复
内存的对其问题,目的是为了加快IO效率。
thinkperson_t410 2013-09-19
  • 打赏
  • 举报
回复
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1)) 1)先看~(a-1)的含义 假设a是8 对应二进制是0000 1000 (a-1)对应的就是 0000 0111 ~(a-1)对应的是 1111 1000 任何一个数 与~(a-1)按位相与 就是把第三方置0 也就是把该数变成 8的倍数 对应题目中的就是 64、128的倍数 也就形成了对齐 2)对于d + (a-1)的操作目的就是 eg:70以64对齐 结果是128而不是64的区别了。
大尾巴猫 2013-09-07
  • 打赏
  • 举报
回复
左半部分 d+a-1 保证处理后的值,这个值除以a得到的商(如果d%a=0,商不变,否则商+1) 右半部分&~(a-1)相当于把余数抹去。 这里,对a有要求,a必须是2的k次幂,也就是a=1,2,4,8,16....
godfather00 2013-09-07
  • 打赏
  • 举报
回复
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1)) 1)先看~(a-1)的含义 假设a是8 对应二进制是0000 1000 (a-1)对应的就是 0000 0111 ~(a-1)对应的是 1111 1000 任何一个数 与~(a-1)按位相与 就是把第三方置0 也就是把该数变成 8的倍数 对应题目中的就是 64、128的倍数 也就形成了对齐 2)对于d + (a-1)的操作目的就是 eg:70以64对齐 结果是128而不是64的区别了
Ptrtoptr 2013-09-06
  • 打赏
  • 举报
回复
大神啊,我长见识了
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
lyramilk 2013-09-06
  • 打赏
  • 举报
回复
类似于取模,只不过它取的是能被整除的部分而不是模。
ztenv 版主 2013-09-06
  • 打赏
  • 举报
回复
宏都会展开,
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
#define ngx_align(d, a)     (((d) + (a - 1)) & ~(a - 1))
#include <stdio.h>
int i;
int main() {
    printf("64\n");
    for (i=1;i<=256;i++) {
        printf("%3d %3d,",i,ngx_align(i, 64));
        if (7==i%8) printf("\n");
    }
    printf("\n");
    printf("128\n");
    for (i=1;i<=256;i++) {
        printf("%3d %3d,",i,ngx_align(i, 128));
        if (7==i%8) printf("\n");
    }
    printf("\n");
    return 0;
}
//64
//  1  64,  2  64,  3  64,  4  64,  5  64,  6  64,  7  64,
//  8  64,  9  64, 10  64, 11  64, 12  64, 13  64, 14  64, 15  64,
// 16  64, 17  64, 18  64, 19  64, 20  64, 21  64, 22  64, 23  64,
// 24  64, 25  64, 26  64, 27  64, 28  64, 29  64, 30  64, 31  64,
// 32  64, 33  64, 34  64, 35  64, 36  64, 37  64, 38  64, 39  64,
// 40  64, 41  64, 42  64, 43  64, 44  64, 45  64, 46  64, 47  64,
// 48  64, 49  64, 50  64, 51  64, 52  64, 53  64, 54  64, 55  64,
// 56  64, 57  64, 58  64, 59  64, 60  64, 61  64, 62  64, 63  64,
// 64  64, 65 128, 66 128, 67 128, 68 128, 69 128, 70 128, 71 128,
// 72 128, 73 128, 74 128, 75 128, 76 128, 77 128, 78 128, 79 128,
// 80 128, 81 128, 82 128, 83 128, 84 128, 85 128, 86 128, 87 128,
// 88 128, 89 128, 90 128, 91 128, 92 128, 93 128, 94 128, 95 128,
// 96 128, 97 128, 98 128, 99 128,100 128,101 128,102 128,103 128,
//104 128,105 128,106 128,107 128,108 128,109 128,110 128,111 128,
//112 128,113 128,114 128,115 128,116 128,117 128,118 128,119 128,
//120 128,121 128,122 128,123 128,124 128,125 128,126 128,127 128,
//128 128,129 192,130 192,131 192,132 192,133 192,134 192,135 192,
//136 192,137 192,138 192,139 192,140 192,141 192,142 192,143 192,
//144 192,145 192,146 192,147 192,148 192,149 192,150 192,151 192,
//152 192,153 192,154 192,155 192,156 192,157 192,158 192,159 192,
//160 192,161 192,162 192,163 192,164 192,165 192,166 192,167 192,
//168 192,169 192,170 192,171 192,172 192,173 192,174 192,175 192,
//176 192,177 192,178 192,179 192,180 192,181 192,182 192,183 192,
//184 192,185 192,186 192,187 192,188 192,189 192,190 192,191 192,
//192 192,193 256,194 256,195 256,196 256,197 256,198 256,199 256,
//200 256,201 256,202 256,203 256,204 256,205 256,206 256,207 256,
//208 256,209 256,210 256,211 256,212 256,213 256,214 256,215 256,
//216 256,217 256,218 256,219 256,220 256,221 256,222 256,223 256,
//224 256,225 256,226 256,227 256,228 256,229 256,230 256,231 256,
//232 256,233 256,234 256,235 256,236 256,237 256,238 256,239 256,
//240 256,241 256,242 256,243 256,244 256,245 256,246 256,247 256,
//248 256,249 256,250 256,251 256,252 256,253 256,254 256,255 256,
//256 256,
//128
//  1 128,  2 128,  3 128,  4 128,  5 128,  6 128,  7 128,
//  8 128,  9 128, 10 128, 11 128, 12 128, 13 128, 14 128, 15 128,
// 16 128, 17 128, 18 128, 19 128, 20 128, 21 128, 22 128, 23 128,
// 24 128, 25 128, 26 128, 27 128, 28 128, 29 128, 30 128, 31 128,
// 32 128, 33 128, 34 128, 35 128, 36 128, 37 128, 38 128, 39 128,
// 40 128, 41 128, 42 128, 43 128, 44 128, 45 128, 46 128, 47 128,
// 48 128, 49 128, 50 128, 51 128, 52 128, 53 128, 54 128, 55 128,
// 56 128, 57 128, 58 128, 59 128, 60 128, 61 128, 62 128, 63 128,
// 64 128, 65 128, 66 128, 67 128, 68 128, 69 128, 70 128, 71 128,
// 72 128, 73 128, 74 128, 75 128, 76 128, 77 128, 78 128, 79 128,
// 80 128, 81 128, 82 128, 83 128, 84 128, 85 128, 86 128, 87 128,
// 88 128, 89 128, 90 128, 91 128, 92 128, 93 128, 94 128, 95 128,
// 96 128, 97 128, 98 128, 99 128,100 128,101 128,102 128,103 128,
//104 128,105 128,106 128,107 128,108 128,109 128,110 128,111 128,
//112 128,113 128,114 128,115 128,116 128,117 128,118 128,119 128,
//120 128,121 128,122 128,123 128,124 128,125 128,126 128,127 128,
//128 128,129 256,130 256,131 256,132 256,133 256,134 256,135 256,
//136 256,137 256,138 256,139 256,140 256,141 256,142 256,143 256,
//144 256,145 256,146 256,147 256,148 256,149 256,150 256,151 256,
//152 256,153 256,154 256,155 256,156 256,157 256,158 256,159 256,
//160 256,161 256,162 256,163 256,164 256,165 256,166 256,167 256,
//168 256,169 256,170 256,171 256,172 256,173 256,174 256,175 256,
//176 256,177 256,178 256,179 256,180 256,181 256,182 256,183 256,
//184 256,185 256,186 256,187 256,188 256,189 256,190 256,191 256,
//192 256,193 256,194 256,195 256,196 256,197 256,198 256,199 256,
//200 256,201 256,202 256,203 256,204 256,205 256,206 256,207 256,
//208 256,209 256,210 256,211 256,212 256,213 256,214 256,215 256,
//216 256,217 256,218 256,219 256,220 256,221 256,222 256,223 256,
//224 256,225 256,226 256,227 256,228 256,229 256,230 256,231 256,
//232 256,233 256,234 256,235 256,236 256,237 256,238 256,239 256,
//240 256,241 256,242 256,243 256,244 256,245 256,246 256,247 256,
//248 256,249 256,250 256,251 256,252 256,253 256,254 256,255 256,
//256 256,
//
千树之影 2013-09-06
  • 打赏
  • 举报
回复
很简单:当a=64时,等价于 (d+63)/64*64

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧