请教大家一个感受:内存对齐

2016-02-29 18:17:22 +08:00
 glogo

Nginx 中有一个宏: ngx_align_ptr ,定义如下:
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
然后好奇的 google 了,发现这篇文章 http://oopschen.github.io/article/2013-09-01/cpu-cacheline.html
通过里面的例子发现对齐并没有效果那么明显.....

所有在这里向大伙儿请教下,使用了内存对齐给你的程序和工作带来了哪里飞一般的“感受”
(如能附上例子更好了~)

4343 次点击
所在节点    C
36 条回复
mko0okmko0
2016-03-01 08:58:13 +08:00
这不是编译工具链该做的吗?
我觉得代码层先做好逻辑,再谈优化或移植限制.
suntus
2016-03-01 09:46:25 +08:00
用 uthash 时遇到过,用 struct 做 key ,因为内存对齐的缘故,有些位没有正确赋值,会让这个 key 失效,解决办法是每次对 key 赋值前,都把内存归零,这样可以保证填充的位也都是 0
testlc
2016-03-01 10:14:59 +08:00
有时候 socket 结构体需要取消默认对齐方式,按 1 字节的对齐方式
wadahana
2016-03-01 10:21:26 +08:00
arm 处理器 , 32 位长整型指针访问非 4 字节对齐的地址, 16 位整型指针访问奇数地址, 直接挂给你看。
w2exzz
2016-03-01 12:24:09 +08:00
Cache aligned 对 cache 做优化的时候也会对齐
eliteYang
2016-03-01 12:57:01 +08:00
@sinxccc 自定义协议包一般都有这种,特别是包头都需要的,包体一般都是序列化后的 string ,倒是无所谓了
@glogo 随便找一个自定义包头通讯的 C++例子,就可以看到里面的用法,手上暂时没有开源的例子
msg7086
2016-03-01 13:22:06 +08:00
@linux40 应该不分默认不默认吧。不显式申明的话编译器很可能自说自话去处理的。
所以如果要精确控制结构体结构的话,要自己写清楚是否需要对齐。
同样的如果要喂给 avx 系指令集的话,也要自己手动设置对齐到某个边界。
miao1007
2016-03-01 21:08:41 +08:00
这个在通信设备上用的比较多,一般显式的使用 char[x] reserved 进行填充,一般是 4 字节对齐,性能提升是明显的。
glogo
2016-03-02 00:56:50 +08:00
@sinxccc 搜嘎,很可惜,我的工作中没有能进行这类的任务
glogo
2016-03-02 00:59:39 +08:00
@linux40 这个需要实际测试一下,我用 GCC 写的小程序 gcc -Wall 编译并不会自动对齐
glogo
2016-03-02 01:01:22 +08:00
@suntus uthash 这样做的考虑点有关性能方面的么?
glogo
2016-03-02 01:05:30 +08:00
@ershisi 听了各位的分享,感觉也是在做应用层的开发时不是很能有机会去关注到内存对齐,前人的铺垫帮我们做了很多,让我们能有更多的时间专注于业务
glogo
2016-03-02 01:09:27 +08:00
@wadahana 诶, ARM 上的话,我又联想到 Android 平台的指令集,这个有什么说法在里面吗, linux, android, arm....
linux40
2016-03-02 10:03:30 +08:00
@glogo c++呢, c++有一个 alignof 关键字,你写一个 struct 再 alignof 那个 struct 的话会返回 struct 的对齐长度。。。好像是这样。。。
suntus
2016-03-02 14:15:46 +08:00
@glogo 没有性能方面的,只是遇到过的一个需要注意内存对齐的地方了
3dwelcome
2016-03-27 16:49:21 +08:00
你们都没用过 sse 吗?对齐是常识性问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX