问题标签 [memory-alignment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
948 浏览

c - 在 c 结构的最后一个成员处填充

我总是假设,正如他们在这里所说的http://en.wikipedia.org/wiki/Data_structure_alignment,“重要的是要注意最后一个成员填充了所需的字节数,因此结构的总大小应该是任何结构成员的最大对齐的倍数"

所以对于这样的结构,它的大小在 32 处理器上应该是 16

所以我对尺寸是 12 而不是 16 感到非常惊讶!这是为什么 ?有人可以对此有所了解吗?

顺便说一句,所以系统信息

0 投票
7 回答
73593 浏览

c - 与缓存行对齐并了解缓存行大小

为了防止错误共享,我想将数组的每个元素与缓存行对齐。所以首先我需要知道缓存行的大小,所以我为每个元素分配了相应的字节数。其次,我希望数组的开头与缓存行对齐。

我正在使用 Linux 和 8 核 x86 平台。首先我如何找到缓存线的大小。其次,如何与 C 中的缓存行对齐。我使用的是 gcc 编译器。

因此,例如,假设高速缓存行大小为 64,该结构将如下所示。

依此类推,当然假设 0-63 与高速缓存行对齐。

0 投票
3 回答
434 浏览

c++ - 在哪里可以找到有关跨不同平台/编译器的 C++ 内存对齐的文档?

我正在寻找一个关于 C++ 中的内存对齐、典型方法、编译器之间的差异和常见陷阱的好的(全面的)文档。只是为了检查我对主题的理解是否正确并学习新东西。

这个问题的灵感来自我对另一个问题的回答,其中我使用了以下构造:

它被批评为不符合内存对齐规则。您能否解释一下为什么从内存对齐的角度来看这种方法存在缺陷?一个不起作用的例子将受到高度赞赏。我知道这通常是一种不好的方法,但我经常在网络协议实现中使用它,所以它更像是一个实际问题而不是理论问题。

另外请不要在这里提及严格混叠,这是另一个问题。

0 投票
2 回答
4103 浏览

compiler-construction - 如果内存是字节可寻址的,为什么我们有对齐填充?

既然我们可以单独寻址内存的每个字节,为什么编译器要特别注意确保结构及其成员与内存中的 32 位边界对齐?我在这里可能是错的,但是在 32 位系统上,从 0x0800 开始获取 4 个字节是否与从 0x0801 开始一样快?

0 投票
1 回答
651 浏览

c++ - 未对齐数据的操作速度

据我所知,CPU 在边界上对齐的基准等于该基准的大小时性能最佳。例如,如果每个int数据大小为 4 个字节,那么每个数据的地址int必须是 4 的倍数才能使 CPU 满意;与 2 字节short数据和 8 字节double数据相同。出于这个原因,new运算符和malloc函数总是返回一个是 8 的倍数的地址,因此是 4 和 2 的倍数。

在我的程序中,一些用于处理大字节数组的时间要求严格的算法允许通过将每个连续的 4 个字节转换为一个来跨越计算,unsigned int并且这样可以更快地执行算术。但是,字节数组的地址不能保证是 4 的倍数,因为可能只需要处理字节数组的一部分。

据我所知,英特尔 CPU 可以正确处理未对齐的数据,但会以牺牲速度为代价。如果对未对齐数据的操作速度足够慢,我的程序中的算法就需要重新设计。在这方面,我有两个问题,第一个问题得到以下代码的支持:

所以问题是:

  1. 与 x86、x86-64 和 Itanium 处理器上的 OP1 相比,OP2 慢了多少(如果忽略类型转换和地址增量的成本)?

  2. 在编写跨平台可移植代码时,对于未对齐的数据访问,我应该关注哪些类型的处理器?(我已经知道 RISC 的了)

0 投票
1 回答
585 浏览

c++ - 如何以独立于平台的方式设置对齐方式?

最新的 c++11 标准草案中,第 3.11 章讨论了对齐。
稍后,第 7.6.1 章定义了如何定义对齐的结构(或变量?)

如果我定义这样的结构:

这是否意味着 A 类的所有实例都将对齐到 16 个字节?

或者,我必须像在下一个代码中那样做吗?

如果两个例子都是错误的,如何正确地做呢?

PS我不是在寻找依赖于编译器的解决方案。

0 投票
2 回答
1584 浏览

winapi - 大对齐的 Win32 内存分配

我需要分配具有大对齐方式的大内存区域(兆字节)(也可能在兆字节范围内)。VirtualAlloc 系列函数似乎没有提供执行此操作的选项。

为了实现这一点,我在 Linux 上所做的是映射一个更大的区域 - 足够大以保证其中包含具有所需对齐的足够大的区域 - 然后 munmap 大区域开头和结尾的区域不需要。

例如,假设我需要 4 兆字节,在 1 兆字节边界上对齐(即,最低 20 位为零的区域的开始)。我会映射 5 兆字节。假设我得到区域 0x44ff000-0x49ff000。在该区域内包含区域 0x4500000-0x4900000,它在 1 兆字节边界上对齐。然后我会 munmap 0x44ff000-0x4500000 和 0x4900000-0x49ff000。

我可以在 Win32 上做类似的事情吗?如果我将 VirtualProtect 与 PAGE_NOACCESS 一起使用,内存会被释放吗?有更好的解决方案吗?

0 投票
1 回答
75 浏览

.net - 数据大小和磁盘访问

将数据与存储上的特定大小对齐是否有好处?例如,如果我可以选择使用 1 个字节或 4 个字节来存储信息,这是首选(假设存储大小无关紧要,只有优化)?

我问这个问题主要是因为我知道如果您要考虑内存中的值,它“很重要”(因此,例如,根据本网站上的另一个问题,.NET 布尔值是 4 个字节的原因)。

认为这无关紧要,但我使用的是 .NET 框架(特别是 C#)。

0 投票
7 回答
4271 浏览

c - 由于对齐而在 C 结构中查找孔

gcc 或 clang(或任何其他编译器)中是否有办法吐出有关结构中是否有孔(内存对齐方式)的信息?

谢谢你。

ps:如果有其他方法,请告知我。

0 投票
3 回答
1546 浏览

c - 对齐到 8 的原因是什么?

以上摘自MySQL源码,

为什么要对齐8