问题标签 [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 投票
6 回答
13460 浏览

c++ - 类/结构成员是否总是按照声明的顺序在内存中创建?

这是Rob Walker在此处的回答引发的一个问题。

假设我像这样声明一个类/结构:

假设这些成员将在内存中完全按照该顺序声明是否安全,或者这是依赖于编译器的事情?我问是因为我一直认为编译器可以对它们做任何想做的事情。

这就引出了我的下一个问题。如果上面的例子导致内存对齐问题,为什么编译器不能隐式地把它变成这样的东西:

(我主要是在询问 C++,但我也有兴趣听到 C 的答案)

相关话题

0 投票
8 回答
96307 浏览

memory - 内存对齐的目的

诚然,我不明白。假设您有一个长度为 1 字节的内存字的内存。为什么不能在未对齐地址(即不能被 4 整除)上的单个内存访问中访问 4 字节长的变量,就像对齐地址的情况一样?

0 投票
4 回答
1043 浏览

c - 从 C 访问网络数据包中未对齐数据的安全、高效方法

我正在用 C 语言在 ARM9 处理器上为 Linux 编写程序。该程序将访问包含一系列标记数据的网络数据包,例如:

fieldID 和长度字段都是 uint16_t。数据可以是 1 个或更多字节(如果使用全长,则最多 64k,但不是)。

只要<data>字节数是偶数,我看不出问题。但是如果我有一个 1 或 3 或 5 字节<data>的部分,那么下一个 16 位字段 ID 最终不会在 16 位边界上,并且我预计会出现对齐问题。自从我从头开始做这样的事情已经有一段时间了,所以我有点不确定细节。欢迎任何反馈。谢谢。

0 投票
2 回答
2903 浏览

64-bit - 结构对齐到端口代码到 64 位

我有一个 32 位 .NET 程序集,它 PInvoke 到 C 层。我想将此程序集移植到 64 位。我已经阅读了许多与移植到 64 位相关的文档,所有这些似乎都表明如果我们要使用结构,我们需要注意对齐。

我有一个与结构对齐有关的一般性问题,想先澄清一下,这样我就不会错过任何东西。

假设我有一个 C 入口点,它接受一个结构指针并基本上填满了里面的值。此 C 代码没有任何打包指令,并且所有 .NET 结构都与 pack=8 对齐。因此,如果我传递具有相邻整数的结构,我认为解释 .NET 层中填充的数据可能会出现问题,因为 C 默认情况下会使用 pack=4,而我们在 .NET 中将结构解释为 pack=8层,所以认为它可能会导致问题。但似乎并非如此。数据似乎解释得很好。

谁能解释这种行为?

谢谢,尼兰詹

0 投票
10 回答
7397 浏览

macos - 为什么 Mac ABI 要求 x86-32 的 16 字节堆栈对齐?

我可以理解旧 PPC RISC 系统甚至 x86-64 的这一要求,但对于久经考验的旧 x86?在这种情况下,堆栈只需要在 4 字节边界上对齐。是的,一些 MMX/SSE 指令需要 16 字节对齐,但如果这是被调用者的要求,那么它应该确保对齐正确。为什么要让每个调用者都负担这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此要求。我错过了什么吗?

更新:在对此进行了更多调查并咨询了一些内部同事之后,我对此有一些理论:

  1. 操作系统的 PPC、x86 和 x64 版本之间的一致性
  2. 似乎 GCC 代码生成器现在始终执行 sub esp,xxx 然后将数据“移动”到堆栈上,而不是简单地执行“推送”指令。这实际上在某些硬件上可能更快。
  3. 虽然这确实使调用站点有点复杂,但在使用调用者清理堆栈的默认“cdecl”约定时几乎没有额外的开销。

我对最后一项的问题是,对于依赖于被调用方清理堆栈的调用约定,上述要求确实“丑化”了代码生成。例如,某些编译器决定实现更快的基于寄存器的调用样式以供其内部使用(即任何不打算从其他语言或源调用的代码)?这种堆栈对齐的事情可能会抵消通过在寄存器中传递一些参数所获得的一些性能提升。

更新:到目前为止,唯一真正的答案是一致性,但对我来说,这有点太容易了。我在 x86 架构方面拥有超过 20 年的经验,如果一致性,而不是性能或其他具体的东西,真的是原因,那么我恭敬地建议开发人员要求它有点天真。他们忽略了近三年的工具和支持。特别是如果他们希望工具供应商能够快速轻松地为他们的平台调整他们的工具(也许不是......它苹果......),而不必跳过几个看似不必要的障碍。

我会在另一天左右给出这个话题然后关闭它......

有关的

0 投票
17 回答
109172 浏览

c++ - 令人信服的自定义 C++ 分配器示例?

std::allocator放弃定制解决方案有哪些真正好的理由?您是否遇到过任何对正确性、性能、可扩展性等绝对必要的情况?有什么非常聪明的例子吗?

自定义分配器一直是我不太需要的标准库的一个特性。我只是想知道这里是否有人可以提供一些令人信服的例子来证明他们的存在。

0 投票
4 回答
78783 浏览

c - GCC __attribute__((aligned(x))) 是否对齐了堆栈变量?

我有以下代码:

我有以下输出:

为什么地址a[0]不是的倍数0x1000

究竟是__attribute__((aligned(x)))做什么的?我误解了这个解释?

我正在使用 gcc 4.1.2。

0 投票
3 回答
4006 浏览

visual-c++ - Visual C++ 2008 中的结构成员对齐

Visual C++ 让您在项目的属性页面中选择结构成员 alignemnt。问题是,这个配置被用于项目中的所有结构。

有没有办法(VC++ 特定的,我猜)单独设置某个结构的成员对齐?

0 投票
6 回答
31196 浏览

c++ - 对齐和未对齐的内存访问?

对齐和未对齐的内存访问有什么区别?

我在 TMS320C64x DSP 上工作,我想使用内部函数(汇编指令的 C 函数),它有

在哪里_amem2进行 2 个字节的对齐访问和_mem2未对齐访问。

我什么时候应该使用哪个?

0 投票
3 回答
1268 浏览

c++ - 使用 GCC/G++/AS 在固定大小的内存边界上对齐本机代码?

我有一个 C 函数,其中包含将实现字节码解释器的字节码的所有代码。

我想知道是否有一种方法可以在固定大小的边界上对齐内存中的已编译代码段,以便我可以直接计算从字节码值跳转到的地址?排序与数组的工作方式相同,但不是从计算的地址读取,而是跳到它。

我知道我必须将执行下一次跳转的代码放在每个“字节码代码”段的末尾,并且我必须使边界大小至少与最大段的大小一样大。

如果这甚至可能,我将如何告诉编译器/汇编器(gcc / g++ / as)以所述方式对齐?