问题标签 [memory-layout]

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 投票
1 回答
651 浏览

python - Python:使用 mpi4py 发送不连续的数据

我有一个维度为 (N,M) 的 C 有序矩阵

其中我想通过持久 MPI 请求将一发送到另一个节点。但是,使用mpi4py,

由于切片不连续而失败。有人可以建议一种解决方法吗?我相信 CMPI_Type_vector允许stride在创建类型时指定 a 。我怎样才能做到这一点mpi4py

0 投票
3 回答
497 浏览

c - C中的结构大小

输出:

为什么int a[0]不考虑?

我试过了:

并输出:

a[0]是结构的成员。那怎么不考虑结构的大小呢?

0 投票
4 回答
476 浏览

c++ - 在多级继承中派生的虚拟基类会发生什么?

在玩继承时,我碰巧尝试了这个:

这给了我输出6

虽然以下按预期工作,但给出了输出3

为什么会有这种差异?而且,为什么它是第二种情况的两倍?

0 投票
1 回答
195 浏览

haskell - Repa 是否指定其数据的内存布局?

我看不到 Repa 在其任何“清单表示”中为数据指定内存布局。这是在某处指定的吗?

当然我可以通过实验来了解,但我更想知道布局是官方的还是随时可能改变的。

编辑:澄清一下,我了解 aStorable Vector的布局方式,但我想知道Array U DIM2 Double(例如)是行优先、列优先还是某些疯狂的东西。

0 投票
2 回答
2564 浏览

c++ - 键入特征以识别主要基类

如果我有一个类 Base,至少有一个虚函数,以及一个从该类单独继承的 Derived 类,那么(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)即使 Derived 不是标准布局,也可以保证(由 Itanium ABI)为零。然而,在一般情况下,这不一定是真的(例如多重继承)。

是否可以编写一个特征来检测一个类是否是另一个类的主要基类?

Itanium ABI 中的有用部分:

http://refspecs.linux-foundation.org/cxxabi-1.83.html

主要基类

对于动态类,唯一的基类(如果有),它在偏移量 0 处共享虚拟指针。它是第一个(按直接基类顺序)非虚拟动态基类(如果存在)。

动态类

需要虚拟表指针的类(因为它或其基类具有一个或多个虚拟成员函数或虚拟基类)。

0 投票
3 回答
2175 浏览

c++ - 虚拟继承中派生类的大小

我得到的输出是:

在上面的代码中,为什么 ClassD 的输出是 16。请清楚地解释一下这个虚拟继承是如何工作的。

0 投票
1 回答
608 浏览

visual-c++ - 使用 CUDA 的 CPU 和 GPU 代码之间的内存布局不匹配

我正在经历一个非常奇怪的情况。我有这个模板结构:

我已经构建了我的代码来分隔 cpp 和 cu 文件,因此在 cpp 文件中创建了一个_functor 对象并在内核函数中使用。问题是,在内核中执行 operator() 时,我发现了一些我无法仅查看代码来解释的随机行为。就好像我的结构有点损坏了。因此,在 a_functor 对象上调用 sizeof(),我发现:

  • CPU 代码(内核外的 .cpp 和 .cu):64 字节

  • GPU 代码(内核内部):68 字节

显然有某种不匹配毁了整个东西。更进一步,我跟踪了结构参数指针和结构本身之间的距离——试图检查产生的内存布局——这就是我发现的:

我真的不明白为什么 nvcc 为我的结构生成了这个内存布局(那 4 个字节应该是/做什么!?!)。我认为这可能是一个对齐问题,我尝试显式对齐 a_functor,但我不能,因为它是在内核中按值传递的

当我尝试编译时,我得到

错误:无法将显式对齐过大的参数传递给win32 平台上的全局例程

那么,要解决这种奇怪的情况(...而且我确实认为这是一个 nvcc 错误),我该怎么办?我唯一能想到的就是玩对齐并通过指针将我的结构传递给内核以避免上述错误。但是,我真的很想知道:为什么内存布局不匹配?!真的没意思。。。

更多信息:我正在使用 Visual Studio 2008,在 Windows XP 32 位平台上使用 MSVC 进行编译。我安装了最新的 CUDA Toolkit 5.0.35。我的卡是 GeForce GTX 570(计算能力 2.0)。

0 投票
2 回答
1629 浏览

c# - 使用反射来确定 .Net 类型在内存中的布局方式

我正在尝试在 C# 中优化解析器组合器。当序列化格式与内存格式匹配时,一种可能的优化是对要在一个实例或什至该类型的许多实例上解析的数据进行(不安全)memcpy。

我想编写代码来确定内存格式是否与序列化格式匹配,以便动态确定是否可以应用优化。(显然这是一个不安全的优化,并且可能由于很多微妙的原因而不起作用。我只是在试验,不打算在生产代码中使用它。)

我使用属性[StructLayout(LayoutKind.Sequential, Pack = 1)]来强制不填充并强制内存中的顺序与声明顺序相匹配。我用反射检查该属性,但实际上所有这一切都证实了“没有填充”。我还需要字段的顺序。(我强烈希望不必为每个字段手动指定FieldOffset属性,因为这很容易出错。)

我假设我可以使用GetFields返回的字段顺序,但文档明确指出该顺序未指定。

鉴于我强制使用 StructLayout 属性对字段进行排序,有没有办法反映该排序?

编辑我对所有字段都必须是blittable的限制很好。

0 投票
1 回答
234 浏览

cocoa-touch - 使用 NSMutableData 在内存中保留连续空间

如何NSMutableData在同一部分强制保留连续内存?我有相当数量的数据逐个到达,性能并不令人满意。我的数据的总大小将是恒定的。

0 投票
1 回答
913 浏览

c++11 - shared_ptr 引用计数器是如何布局的?

我对 C++ 很陌生。我一直认为shared_ptr是保持单独的指针指向单独的引用计数器变量。但是今天突然意识到其实我不知道它是怎么布局的,而且引用值在C++中不需要有分隔指针。

如果布局是由标准定义的,那么正确的预期布局是std::shared_ptr什么?