问题标签 [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.
c++ - 如何确保成员是 4 字节对齐的?
为了使用 OSAtomicDecrement(mac 特定的原子操作),我需要提供一个 4 字节对齐的 SInt32。
这种烹饪方法有用吗?是否有另一种方法来处理对齐问题?
memory-management - VirtualAlloc 对齐
VirtualAlloc 返回的内存块是否总是与页面大小对齐?换句话说,VirtualAlloc 的返回值和页面大小的模数总是为零吗?
assembly - x86 操作码对齐参考和指南
我正在 JIT 编译器中动态生成一些操作码,并且正在寻找操作码对齐的指南。
1)我已经阅读了通过在调用后添加 nop 来简要“推荐”对齐的评论
2)我还阅读了有关使用 nop 优化序列以实现并行性的信息。
3)我读过操作对齐有利于“缓存”性能
通常这些评论不提供任何支持参考。阅读博客或评论说“这样做是个好主意”是一回事,但实际编写实现特定操作序列并在线实现大多数材料(尤其是博客)的编译器是另一回事用于实际应用。所以我相信自己会发现事情(反汇编等,看看现实世界的应用程序做了什么)。这是我需要一些外部信息的一种情况。
我注意到编译器通常会在之前的任何指令序列之后立即启动奇数字节指令。所以编译器在大多数情况下并没有特别注意。我在这里或那里看到“nop”,但通常似乎很少使用 nop,如果有的话。操作码对齐有多重要?您能否为我可以实际用于实施的案例提供参考?谢谢。
c++ - boost库应该依赖于结构成员对齐吗?
我发现,困难的方式至少boost::program_options
取决于编译器配置的结构成员对齐方式。
如果您使用默认设置构建 boost 并使用 4 字节对齐 ( ) 将其与项目链接,/Zp4
它将在运行时失败(使用 program_options 进行最小测试)。Boost 将生成一个断言,指示可能存在错误的调用约定,但真正的原因是结构成员对齐。
有什么办法可以防止这种情况发生吗?如果对齐使代码不兼容,这不应该包含在库命名中吗?
memory - 为什么有效访问需要 4 的内存对齐?
我理解为什么需要对齐数据(以及为完成它所做的所有努力,比如填充),这样我们就可以减少内存访问的次数,但这假设处理器只能获取 4 的倍数(假设我们使用的是 32 位建筑学)。由于这个假设,我们需要对齐内存。
我的问题是:
为什么我们只能访问 4 的倍数(效率、硬件限制、另一个)?
这样做的好处是什么?为什么我们不能访问所有可用的地址?
c - “内存是 8 字节对齐的”是什么意思?
在进行一个项目时,我看到内存数据是“8 字节对齐的”。谁能解释一下这是什么意思?
c++ - 将字节数组转换为结构指针取决于字节序或内存对齐?
假设这段代码:
我可以一直假设s->a == 1, s->b == 2, s->c == 3
吗?
还是取决于系统的字节顺序或内存对齐方式?
c++ - 使用数组下标运算符访问结构成员
让我们有一个类型 T 和一个只有 T 类型的统一元素的结构。
我想以休闲的方式访问它们:
其中cpp_offsetof
宏(被认为是正确的)是:
C++ 标准不保证这一点,但我们可以假设成员之间有一个固定的偏移量,以上是正确的跨平台解决方案吗?
100% 兼容的解决方案是:
[编辑] snk_kid 使用指向数据成员的指针提供了标准、合规和更快的版本[/edit]
但它需要额外的查找表,我试图避免这种情况。
//编辑
还有一个。我不能只使用数组和常量来索引这些字段,它们必须被命名为结构的字段(某些宏需要)。
//EDIT2
为什么必须命名结构的字段?什么是宏?它是一个更大项目的设置系统。简化它是这样的:
再一次:我不是在寻找 100% 兼容的解决方案,而是 99%。我在问我们是否可以期望一些编译器会在统一字段之间放置非统一填充。
c++ - 为什么这个 EXC_BAD_ACCESS 发生在 long long 而不是 int 上?
我遇到EXC_BAD_ACCESS
了一段处理数据序列化的代码。该代码仅在设备(iPhone)上失败,而不在模拟器上失败。它也仅在某些数据类型上失败。
这是重现问题的测试代码:
猜测这一定是内存对齐问题,我决定彻底了解这个问题。根据我对内存对齐的(有限)理解,当tmp
提前 2 个字节时,对于对齐大于 2 个字节的数据类型,它会变得不对齐:
但是测试代码对于int
和其他人执行得很好!它只对long long
,double
和失败long double
。
检查每种数据类型的大小和对齐方式表明,失败的数据类型是具有不同sizeof
和__alignof
值的数据类型:
(这些是从“C++ 数据对齐和可移植性”运行打印功能的结果)
有人能告诉我是什么导致了错误吗?差异真的是原因EXC_BAD_ACCESS
吗?如果是这样,通过什么机制?
c++ - VC++ 支持 _mm_malloc 吗?
Visual Studio C++ 2008/2010 是否_mm_malloc
正式支持?它在中定义,malloc.h
但我在 MSDN 库中找不到它的描述。