问题标签 [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.
c++ - 为什么 vptr 存储为具有虚函数的类的内存中的第一个条目?
对于一些编译器,如果一个类有虚函数,那么它的 vptr 可以通过其对象的第一个字节的地址来访问。例如,
我知道它取决于不同的编译器行为。由于存在将 vptr 作为第一个条目存储的情况,这样做有什么好处?这有助于提高性能还是仅仅因为使用 &b 更容易访问 vbtl?
c - C程序的内存分析
需要对我的 C 应用程序进行内存分析..
它应该包括占用空间大小和 RAM 大小......
例如,如果我的应用程序如下所示..
输出:
所以现在我应该考虑使用哪个内存来分析占用空间,以及加载程序时的 RAM ..
下面的分析是正确的吗?占用内存 = 760(即闪存或硬盘) RAM = 67+8+0 = 75 字节
需要专家的建议
arrays - go 如何在内存中布局结构数组?
数组将如何在内存中布局?
实际的物体会并排排列吗
或者数组是指针数组,对象存储在其他地方,比如Java?
堆中的某处:
另外,如何make()
在内存中布局切片?
c++ - 是否存在与指针具有相同大小和对齐方式的整数类型?
是否存在与指针具有相同大小和对齐方式的整数类型?
有std::intptr_t
and std::uintptr_t
,但我相信它们与指针本身的对齐方式不同。
c++ - 为什么具有虚函数的类与没有虚函数的类对齐方式不同?
受Richard Powell 的这个 cppcon 演讲的启发,我创建了以下代码片段来愚弄:
这将打印:
添加virtual
后who()
我得到了这个
现在,向void*
结构添加大小很简单,但为什么在虚拟情况下而不是在非虚拟情况下会有这种填充(Richard 在他的演讲中也提到过)?
我已经在 Ubuntu 14.04 64 位上使用 gcc 5.3.0 和 clang 3.7.1 对其进行了测试
c++ - 多重继承期间的对象构造和虚拟指针
测试对象的大小为 8 个字节。所以从这个例子中可以明显看出,该对象由两个 4 字节的 _vptr 组成。由于继承的顺序是public Base1,public Base2
这意味着对象应该以下列方式制作:
但从代码片段看来,该对象是这样制作的:
第一个 vptr 指向一个由 3 个函数指针组成的数组(第一个指向Base1::fun1()
,第二个指向Base1::func1()
,第三个指向Test::test()
)。
派生对象由 Base+Derived 组成。这意味着第一个字节块是 Base 对象,其余的是 Derived。如果是这样,那么在我们的 objTest 示例中,第二个应该_vptr
指向三个函数指针(第一个指向Base2::fun1()
和)。但是我们看到 first指向 的函数指针。Base2::func1()
Test::test()
_vptr
Test::test()
问题:
1.这种行为编译器是特定的吗?
2.标准是否提到了这种行为?还是我的理解完全错误?
ios - 在 Apples Metal 框架中定义结构
我正在玩 Metal for iOS 制作一个小游戏。在我的一个内核着色器中(在我的 .metal 文件中)。我正在定义一个结构来保存游戏部分的一些元数据。
结构如下所示:
这工作得很好,但是当我尝试向我的结构添加更多字段时,例如:
代码行为不端,似乎无法使用某些字段。此时未使用新字段。我的第一个想法是它与结构的内存对齐有关。我的印象是编译器会添加正确的填充,但仍然继续尝试自己正确对齐结构的大小(按降序排列字段并将结构对齐到 48 和 64 字节),但没有任何成功。我还尝试使用打包数据类型来避免对齐问题,但仍然没有成功。
我知道逻辑是正确的,因为我在不使用结构的情况下编写了相同的逻辑,然后将其移植到使用结构来保存具有完全相同行为的数据。但是此时向它添加任何字段都会破坏它。此外,保留原始结构但使用打包数据类型也会以类似的方式破坏它。
所以这绝对看起来像是一个内存布局问题,但我不清楚如何在不解决该问题的情况下解决它。
我可以尝试任何想法或想法吗?
编辑:
数据不会通过 MTLBuffer 传递到我的计算着色器中,而是简单地定义在 .metal 文件中的常量内存空间中,如下所示:
编辑2:
试图描述更多的发现以及代码实际在做什么。
有问题的中断函数是一种假设基于此结构中提供的值淡化颜色的方法。
当我将结构定义为:
如果我向它添加一个浮点数(即使我没有在任何地方阅读它并且它不是任何计算的一部分。这只是为了找出错误在哪里)。
在这一点上,如果我没有在构造中指定新的浮点数,它仍然可以正常工作。
但如果我这样做:
上面指定的功能停止工作,颜色不再褪色。
另一个有趣的观察是,如果我使用 int 代替一切正常:
c++ - 如何评估指针和 reinterpret_cast?
我有以下在 Visual Studio 中运行的代码。的地址与c
指向的地址相同,pa
但与 不同pb
。然而,这两个三元运算符都将评估为true
,这是仅查看代码而不查看 pa 和pb
调试器中的指向地址所期望的结果。第三个三元运算符将评估为false
。
这是如何运作的?
c - 每个结构具有不同类型的原因是否可以解释?
例如,由于可能的对齐,指向不同类型的指针不能直接相互转换(也许不是完全正确的陈述,但你还是不明白我的想法)。是否有类似的技术原因导致您不能执行以下操作:
现在删除我并编辑这个问题,如果你理解它(在一些奇怪的情况下)并将它翻译给公众。
memory-management - Dlang - 有没有办法在对象中嵌入对象?
根据 D 规范,所有类都通过引用访问,这意味着以下类将按如下方式在内存中布局。
伪代码:
A类型对象的内存布局:
有没有办法创建一个将 b 直接嵌入 A 而不是引用的类?还是我忽略了什么?