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

c++ - 命名数组元素或联合中的结构和数组

考虑以下结构:

在我看来,我在 WinApi 的 IPAddress 结构中看到了类似的东西。这个想法是让我可以按索引和名称使用数组组件,例如:

在 C++ 标准中,保证在 POD 结构的开头不会有“空”空间,也就是说,元素 x 将位于 Endpoint 结构的开头。目前很好。但是我似乎没有找到任何保证不会有空白或填充,如果你愿意的话,在xand y, or yandz等之间。虽然我还没有检查过 C99 标准。

问题是,如果 Endpoint 结构元素之间有一个空白空间,那么这个想法就行不通了。

问题:

  1. 我是对的,确实不能保证这将在 C 或 C++ 中工作。

  2. 这实际上适用于任何已知的实现吗?换句话说,您是否知道这不起作用的任何实现?

  3. 是否有任何标准(我的意思不是特定于编译器)的方式来表达相同的想法?也许 C++0x 对齐功能可能会有所帮助?

顺便说一句,这不是我在生产代码中做的事情,别担心,只是好奇。提前致谢。

0 投票
1 回答
1112 浏览

c - 预取对齐内存

我有一些线程化的 C 代码,需要对已处理的数据结构进行 64 字节对齐。这种对齐将如何与 gcc __builtin_prefetch 等预取指令交互?预取的效果是否与使用非对齐数组相同?

请注意,我使用 memalign 来获取对齐的数组。

谢谢。

0 投票
3 回答
1388 浏览

c++ - 在 C 和 C++ 中对齐堆数组以简化编译器 (GCC) 向量化

我目前正在制作一个包装容器模板类,std::vector它会自动multi-resolution pyramid在其std::vector.

现在的关键问题是我希望金字塔的创建是 (GCC) auto-vectorizable

内部存储在 std::vector 和我的分辨率金字塔中的所有数据数组都是使用标准 new 或分配器模板参数在堆上创建的。有什么方法可以帮助编译器强制对我的数据进行特定对齐,以便矢量化可以在具有最佳对齐(通常为 16)的元素(数组)(块)上进行操作。

因此,我使用自定义分配器 AlignmentAllocator,但 GCC 自动矢量化消息输出仍然在第 144 行声明包含表达式的未对齐内存std::mr_vector::construct_pyramidmulti_resolution.hpp

如下

我可以以某种方式(强烈)类型指定来自的指针memalign的对齐方式,以便 GCC 可以确定指向的区域data()具有所需的对齐方式(在本例中为 16)?

/每

mr_vector模板类的代码multi_resolution.hpp

自定义分配器AlignmentAllocator的代码allocators.hpp如下:

0 投票
9 回答
171 浏览

c - 写比 malloced 更多的字符。为什么它不会失败?

为什么以下工作不会引发某种分段错误?

但是,如果我添加

这个调用不应该失败,因为 strcat 使用的内存比分配的多吗?因此,不应该

也失败了,因为它试图释放 16 个字节,但我使用了 26 个字节(“/usr/bin/012RANDOMBUNNIES\0”)?

非常感谢您!

0 投票
4 回答
206 浏览

c++ - 在初始化列表中从 float* 设置 double[]

我有一个大致如下所示的类:

对于构造函数,我知道它void* data指向一个float值数组(维度暗淡)。现在我想vals在该构造函数的初始化列表中初始化 -array (最好)。

更糟糕的是,指向的浮点数不一定必须正确对齐内存。

我怎样才能有效地做到这一点?


编辑 1

关于下面发生的讨论,让我先说明我的设计优先事项。这可能会帮助您专注于对我来说最重要的问题。

  1. 应对糟糕的内存对齐
  2. 在性能方面获得尽可能少的操作。

老实说,如果我们需要构造函数体来获得快速算法的工作,这对我来说也很好。重点是原始功率。

0 投票
3 回答
3620 浏览

c++ - 结构成员和静态变量的对齐

我们有一些带有类的遗留代码,这些类具有在 Interlocked* 函数调用中使用的成员。

我想确保我拥有的一些成员变量在 4 字节边界上对齐(用于 InterlockedIncrement,请参阅http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx) .

我找不到任何明确的内容来指定 VS 2010 结构成员的默认对齐方式。实验上,我无法在不更改默认打包的情况下使结构违反 4 字节对齐方式。我所能找到的只是默认打包是 8 个字节,我们到处都在使用它。

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/30/222631.aspx

我想知道的是我们是否需要将 __declspec(align(4)) 添加到 Interlocked* 调用中使用的每个变量?

编辑:我知道包装以及如何做。道歉不够具体。CRT 是否还会分配我的所有结构,以便在默认打包 8 个字节的情况下,我的所有结构成员默认对齐在 4 个字节边界上?

32 位 int 静态变量会默认对齐吗?我正在寻找一些关于 VS 的文档,但我很难找到解释默认值的文档。

0 投票
4 回答
3489 浏览

c++ - 如何模拟 alignas(T)?

我有一个数组,用作类型对象的底层内存T

如何确保对象memory正确对齐T?在 C++0x 中,我只能说:

但 Visual Studio 2010 尚不支持该特定功能。

0 投票
2 回答
394 浏览

c - 内存对齐64位

我今天一直在玩 C,而我从来没有机会玩过的东西,那就是使用带有指向函数的指针的结构......一切都很顺利,直到我开始得到一些奇怪的错误,当我在清理时整个事情(顺便说一句:我在 x86_64 arch 中编译,在 Mac 中) 看了又看,我发现这是node_vtable结构中的内存对齐。

在 i386 中,它工作正常.. 没有任何问题。但是,正如我在 x86_64 中所说,它不起作用。

现在,我修复了将指针移动node * (*create_node) (linked_list *, float, int, int );到结构末尾的问题,因为该指针的大小为 24 字节,这是该结构中最大的。但是,我真的认为肯定有一个更优雅的解决方案,而且我也在寻找一个明确的解释。因此,如果有人可以给出提示或解释,那就太好了;) ....因为我的大脑现在真的卡住了:)

整个代码:

干杯

0 投票
2 回答
4469 浏览

c - 对齐与打包属性

我正在开发 16 位 PIC 的固件并用 C(Microchip C30 编译器)编写。我的设备从外部设备接收到一长串字节,然后我试图将这些字节复制到一个结构中。结构定义如下:

我遇到了一个奇怪的问题,每当结构中的字节总数为奇数时,我的程序就会冻结并陷入 AddressError 服务例程。我可以通过简单地向结构添加一个额外的字节来解决这个问题,但这似乎是一个创可贴的修复。

我将打包属性放在结构上,因为我想确保编译器没有在我的变量之间插入任何填充字节。如果发生这种情况,从接收到的字符数组复制时,我的结构中的值将不正确。

我知道还有一个属性叫做对齐。对齐只是将结构的开头对齐到偶数字节还是将结构中的每个项目对齐到偶数字节?你认为这里需要对齐属性吗?如果我将对齐属​​性添加到此结构中,我也应该将其添加到发送数据的设备上的结构中,对吗?到目前为止,它们的定义方式与上图完全相同。

如果我添加对齐的属性,我应该删除打包的属性吗?他们基本上不做相反的事情吗?

0 投票
2 回答
573 浏览

c++ - 如何在 ODBC 中可移植地实现任意结果集的逐行绑定,同时避免对齐问题?

我有一个类,它接受一个 SQL 查询,执行它,然后使用逐行绑定将结果集中的每一列绑定为 SQL_C_WCHAR。

现在我这样做的方法是分配一个 char 向量,并确定提供 SQLBindColumn 的指针,如下所示:

  • 第 1 列的缓冲区 = &vec[0]
  • 第 1 列长度指示器的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列的长度)
  • 第 2 列的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列的长度) + sizeof(长度指示符)
  • 第 2 列长度指示符的缓冲区 = &vec[0] + (sizeof(SQLWCHAR) * 第 1 列长度) + sizeof(长度指示符) + (sizeof(SQLWCHAR) * 第 2 列长度)

等等

这会导致一些对齐问题(在 SPARC 上)。我知道我需要添加一些填充,但我不知道如何计算便携性。