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

variant - 变体类型存储和对齐问题

我制作了一个变体类型来代替 boost::variant。我的工作是将当前类型的索引存储在可能类型的列表中,并将数据存储在一个字节数组中,该数组有足够的空间来存储最大的类型。

现在,当我向这个变体类型写入一个值时,麻烦就来了。我使用以下内容:

崩溃的行是将数据存储到内部缓冲区的行。如您所见,我只是将字节数组直接转换为所需类型的指针。在尝试写入某些值时,这会给我带来错误的地址信号和总线错误。

我在 64 位系统上使用 GCC。如何设置字节数组的对齐方式以确保数组的地址是 64 位对齐的?(或与我可能将此项目移植到的任何架构正确对齐)。

编辑:谢谢大家,但错误在其他地方。显然,英特尔并不真正关心对齐。对齐的东西更快但不是强制性的,并且程序以这种方式运行良好。我的问题是我在写东西之前没有清除数据缓冲区,这给某些类型的构造函数带来了麻烦。但是,我不会将问题标记为已回答,以便更多人可以给我关于对齐的提示;)

0 投票
10 回答
45003 浏览

c++ - C 结构中的内存对齐

我正在使用 32 位机器,所以我想内存对齐应该是 4 个字节。假设我有这个结构:

普通添加的大小是 6 个字节,我想对齐的大小应该是 8,但sizeof(myStruct)返回我 6。

但是,如果我写:

普通添加大小为 10 个字节,对齐大小应为 12,这次是sizeof(myStruct) == 12.

有人可以解释有什么区别吗?

0 投票
2 回答
4326 浏览

c - 为什么在 64 位架构上对齐是 16 字节?

为什么不只是 8 个字节?

0 投票
4 回答
2313 浏览

c - Solaris 和 Linux 上未对齐的内存访问差异

我在 linux(x86,32 位)上编写了一个程序,一切正常。但是当我尝试在 Solaris(SPARC,64 位)上编译和运行相同的源代码时,出现总线错误(SIGBUS)。来自 gdb 的消息如下:

原来这个bug是因为fscanf函数,对应的代码片段如下:

基本上,我尝试从逗号分隔值文件中提取信息并将它们存储在结构(记录)数组中,例如:

记录结构如下:

正如您可能注意到的,我使用了 pragma pack 来尝试防止这两台机器之间的对齐差异。

0 投票
4 回答
297 浏览

c++ - 处理多重继承时如何对齐指针?

假设我们有一个具体类 A 和一个抽象类 B。

考虑一个具体的 C,它继承自 A 和 B,并实现了 B:

现在我定义一个签名的函数void foo(B* b);

这是我的代码,我可以假设每个指向 B 的指针都是 A 和 B。在 foo 的定义中,如何获取指向 A 的指针?一个讨厌但有效的技巧是像这样对齐反向指针:

请记住,C 没有超类型,实际上,有许多类似于 C 的类,只有 A 和 B。请随意质疑我的逻辑和这个设计示例,但问题仅与指针对齐有关.

0 投票
0 回答
276 浏览

gcc - 混合内存对齐和未对齐的代码

我最近编译了 GotoBLAS2 (MacOSX 10.6) 并将其链接到我的代码,导致各种错误的结果。我通过 valgrind 运行所有内容,注意到来自 GotoBLAS 的一些非法读取。当更仔细地查看它时,我发现 GotoBLAS 是使用 -m128bit-long-double 对齐选项编译的。一旦我也用这个标志编译了我的代码(尽管我根本不使用任何长双打),一切正常,给出正确的结果,没有任何 valgrind 模糊。

现在我的问题是:

  • 我是否必须使用相同的对齐标志编译所有其他库依赖项?
0 投票
1 回答
6399 浏览

opencv - OpenCV 的 cv::Mat & CvMat 行对齐

有人可以向我解释一下 OpenCV CvMat(或其 C++ 版本cv::Mat)的行对齐是如何工作的吗?例如,假设我有一个矩阵

根据 的文档CvMat,行应对齐 4 个字节,即矩阵的第一行应填充一个零,第二行应从偏移量 +4 开始)。但是,如果我调试这段代码,数据是连续的(即cvmat->datais [1,2,3,4,5,6]),我看不到任何 4 字节对齐。这是文档中的错误吗?假设CvMator的数据的连续性总是安全的cv::Mat(如果矩阵不是另一个 ofc 的一部分)?或者是否有一些特殊的配置,由于内存对齐,数据中可能会出现一些间隙?

0 投票
2 回答
683 浏览

java - Java VM 如何处理 MT 上下文中的缓存行和内存对齐?

根据主题,如果在 C/C++ 中很容易找到缓存行大小并在开发高效的 MT 代码时处理这个问题,Java VM 如何处理这个问题?

干杯

0 投票
2 回答
324 浏览

c++ - 非交错存储元组的 C++ 容器

我正在寻找tuplesstd::vectortuplesstd::array的变体,其中元组元素非交错放置到单独的内存区域中,而不是交错放置,例如 a 。std::vector<std::tuple<...>>

这样做的动机是

  • 更好地控制对齐进而提高矢量优化的性能。
  • 防止我们在 OpenGL 中连接低级 CPU-GPU 数据传输操作(例如顶点和颜色数组)时解包数据元素。

迭代器应在取消引用时boost::tuple<> 即时构造并返回一个。

我知道并非所有 STL 成员函数都可以在此容器中得到有效支持。例如,STLdata()容器成员函数必须将所有单独的数组动态压缩到一个可变的动态创建的向量容器中并返回其 data()。

有没有人已经构建了这样一个表格容器?

0 投票
1 回答
367 浏览

memory - 内存对齐访问是否更快?

假设我的机器字是 32 位长,我必须对 8 个字符的字符串进行排序。
我已经读过,如果您将字符打包成单词,则比较会更快,因为您使用对齐的内存访问。
所以在我们的例子中,我们将字符串分成 4 个字节的两个单词,并使用每个字符串的第一个单词进行比较,如果它们恰好相等,那么您检查每个字符串的第二个单词。

性能会提高吗?它变得更快了吗?由于编码变得更加复杂,它有回报吗?如果它有效,它是否适用于所有语言?