java字节对齐 32 64_大约32位64位:为什么C中的double是8个字节对齐?

我正在阅读一篇有关内存中数据类型对齐的文章(此处),我无法理解一点,即

Note that a double variable will be allocated on 8 byte boundary on 32

bit machine and requires two memory read cycles. On a 64 bit machine,

based on number of banks, double variable will be allocated on 8 byte

boundary and requires only one memory read cycle.

我的疑问是:为什么需要在8字节边界而不是4字节边界上分配双变量? 如果将其分配在4字节边界上,我们仍然只需要2个内存读取周期(在32位计算机上)。 如果我错了,请纠正我。

另外,如果有人对成员/内存对齐有很好的教程,请分享。

看到这个答案:stackoverflow.com/a/9468315/612429

它与高速缓存对齐以及SSE指令要求匹配。

所有这些都取决于硬件体系结构,而不取决于C。

@ m0skit0:如果所有内容都依赖于拱,那么对于不同的编译器为什么会有所不同... A double (eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with -malign-double compile time option). ...来源en.wikipedia.org/wiki/Data_structure_alignment

@OliverCharlesworth:SSE没有需要8字节对齐的加载/存储。 对于16字节的加载/存储,它要么需要16字节对齐,要么对于任何较窄的操作数都不需要对齐。 但是,是的,使双精度8字节对齐对它们的性能有好处,因此它们不能跨高速缓存行拆分。 (或者对于任何关心高速缓存行内对齐的CPU,跨越任何其他大于8个字节的边界)。

将大小为2 ^ N的数据值对齐在2 ^ N的边界上的原因是为了避免该值将在缓存行边界上分割的可能性。

x86-32处理器最多可以从两个32位存储器读取中的任何字边界(是否对齐8个字节)中获取一个双精度字。但是,如果将值跨高速缓存行边界分割,则取回第二个字的时间可能会很长,因为需要从内存中取回第二个高速缓存行。这不必要地导致处理器性能变差。 (实际上,当前的处理器不会一次从内存中获取32位;它们倾向于在更宽的总线上获取更大的值,以实现真正的高数据带宽;如果它们同时获取两个字,则实际时间为在同一缓存行中,并且已经缓存,可能只有1个时钟)。

此对齐方案的一个免费结果是,这些值也不会跨越页面边界。这样避免了在数据获取过程中出现页面错误的可能性。

因此,出于性能原因,应在8字节边界上对齐双精度。编译器知道这一点,并为您完成。

那么在4字节边界对齐会出现什么问题?对于32位系统,仍然需要2个周期

@Raman:您正在考虑从导致从主内存中获取缓存行的位置读取第二32位的开销。与" 1个周期"花费0.2 ns相比,这种获取需要数十纳秒的时间,因此它的获取不仅仅是1个周期。这可能很少见,但如果发生的话,它会非常昂贵。

像P5 Pentium一样老的CPU中的x87 FPU可以一次从缓存中加载64位。这就是为什么gcc选择使用-m32给出double 8字节对齐的原因,除非在i386 System V ABI可能会强制其未对齐的结构中。使用gcc编译器针对x86体系结构的双栈对齐问题。在2012年,所有关于32位CPU无法获取两倍整数的说法都是胡说八道。多数民众赞成在只是整数寄存器的宽度。从历史上来看,这是正确的,但是ABI设计的原因。

8位对齐(双字节32位体系结构)不会减少内存读取,但是就减少缓存访问而言,它仍然可以提高系统性能。请阅读以下内容:

https://stackoverflow.com/a/21220331/5038027

将值对齐到比其大小小的边界上会使它易于被分成两条高速缓存行。将值分成两个缓存行意味着在将缓存行逐出到后备存储时会额外的工作(将逐出两个缓存行;而不是一个),这是无用的内存总线负载。

请参阅此Wiki有关双精度浮点格式的文章

内存周期数取决于您的硬件体系结构,该体系结构决定了您有多少个RAM组。如果您具有32位架构和4个RAM组,则只需2个存储周期即可读取(每个RAM组提供1个字节)

不了解有关仅需要一个内存周期的评论。首先,"双精度"通常表示8字节浮点数,其次,32位体系结构通常表示32位数据总线。不管您如何组织RAM,一次操作都无法从32位管道中获取64位

发生类型错误。再次改写:具有4个RAM组的32位计算机将在2个内存周期内访问8个字节。

嗯谢谢现在对我来说更有意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值