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

c++ - 可变大小的类 - C++

我见过一个类是这样定义的类..

静态工厂函数有以下实现..

据我了解,这个函数使用placement new 来扩展这个类。

这是否只是因为只有 1 个成员并且它是在堆上分配的?

0 投票
2 回答
1756 浏览

c# - C# 结构中的成员顺序不正确

我有一个 TCP 客户端,它将一个数据包放入一个结构中

我用来将数据包放入结构中的代码是:

现在,在我继续之前,我必须告诉你我正在将这个项目从 C++ 翻译成 C#。

这就是问题:

tPacket_5000_E 的最后 3 个成员是 Int32(我也尝试过 UInt32),它是 C++ 中的 DWORD。这三个成员之前的值,不是Int32,与 C++ 中的值相同。(我在 C++ 和 C# 项目中注入了相同的数据包)。

但是,这三个成员的价值观不同。

在 C++ 中,值是(正确的):

  1. 种子计数:0x00000079
  2. 种子CRC:0x000000d1
  3. 种子安全:
  4. -[0]:0x548ac099
  5. - 1:0x03c4d378
  6. -[2]:0x292e9eab
  7. -[3]:0x4eee5ee3
  8. -[4]:0x1071206e

在 C# 中,这些值是(不正确的):

  1. 种子数:0xd1000000
  2. 种子CRC:0x99000000
  3. 种子安全:
  4. -[0]:0x78548ac0
  5. - 1:0xab03c4d3
  6. -[2]:0xe3292e9e
  7. -[3]:0x6e4eee5e
  8. -[4]:0x00107120

两个应用程序中的数据包相等

点击这里查看更多信息

为什么结构中的最后三个成员不同以及如何修复它们?

提前致谢!

0 投票
4 回答
10019 浏览

c++ - 虚函数和多继承情况下的对象布局

我最近在一次采访中被问及涉及虚拟功能和多重继承的对象布局。
我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入指向虚拟表的秘密指针等等)。
在我看来,我的解释中缺少一些东西。
所以这里有问题(见下面的例子)

  1. C类对象的确切内存布局是什么。
  2. C 类的虚拟表条目。
  3. A、B 和 C 类对象的大小(由 sizeof 返回)。(8、8、16 ??)
  4. 如果使用虚拟继承会怎样。肯定会影响大小和虚拟表条目吗?

示例代码:

谢谢!

0 投票
2 回答
2718 浏览

delphi - X的动态数组的Delphi动态数组的内存布局是什么?

我正在尝试从 C# 调用 Delphi DLL 中的过程。该过程期望调用者预先分配并输入一个array of array of TSomeRecord,然后它将操作其中的TSomeRecord元素作为返回结果的一种方式。所以,我需要手工制作 X 数组的 Delphi 动态数组。
现在,我在这里发现动态array of X由指向动态数组的第一个元素的指针组成,并且该第一个元素具有引用计数和长度(元素的数量)数组的前置(都是 32 位整数),并且元素是内联和连续存储的,所以整个事情在内存中看起来像这样:

rrrr 是引用计数,llll 是长度,0123 是元素,而 ^ 是指针指向的位置。这证明了;我已经对其进行了测试,并且可以正常工作。
对于多维动态数组,我假设我可以替换array of Yin Xarray of X换句话说,外部维度只是动态数组(指向)的动态数组,如下所示:

其中元素 0000、1111 等现在是指向独立分配的动态数组的 32 位指针。但是,这样做会因为我的麻烦而导致访问冲突。这显然不是 Delphi 期望我做的。谁能向我解释我应该怎么做?

0 投票
3 回答
124418 浏览

c - C中的结构内存布局

我有 C# 背景。我是 C 等低级语言的新手。

在 C# 中,struct默认情况下, 的内存由编译器布局。编译器可以重新排序数据字段或隐式填充字段之间的附加位。因此,我必须指定一些特殊属性来覆盖此行为以实现精确布局。

structAFAIK,默认情况下,C 不会重新排序或对齐 a 的内存布局。但是,我听说有一个很难找到的小例外。

C 的内存布局行为是什么?什么应该重新排序/对齐而不是?

0 投票
1 回答
4809 浏览

linux - 为什么 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?

在 Ubuntu x86 系统上反汇编 ELF 二进制文件我不禁注意到代码(.text)部分从虚拟地址 0x8048000 开始,并且所有较低的内存地址似乎都未使用。

这似乎相当浪费,所有谷歌出现的要么是涉及 STACK_TOP 的民间传说,要么是针对空指针取消引用的保护。后一种情况看起来可以通过使用单个页面而不是留下 128MB 的间隙来修复。

所以我的问题是——对于为什么布局被固定为这些值或者它只是一个任意的选择,有一个明确的答案吗?

0 投票
3 回答
3903 浏览

c++ - 使用 g++ 编译器打印 C++ 对象的布局

有没有办法使用 g++ 编译器或任何其他方式打印 C++ 对象的布局。一个简化的例子(假设 int 需要 4 个字节)

所以输出将是

了解对象的布局(在我的例子中是虚拟机代码)会很有用。

提前致谢。

问候,扎希尔

0 投票
2 回答
4895 浏览

c++ - 一个类的对象(使用单/多继承)将有多少个 vptr?

一个对象的 clas(child) 与一个多重继承 base1 和 base2 的基类具有单继承关系,通常需要多少个 vptr。确定一个对象提供了多少个 vptr 的策略是什么,它具有一对单继承和多继承。虽然标准没有具体说明 vptrs 但我只想知道一个实现是如何实现虚拟功能的。

0 投票
2 回答
753 浏览

vector - 矢量的内存布局

有人可以解释存储在 a 中的数据的内存布局vector<bool>吗?

就像内存从地址&myVec[0]向上有什么布局?它取决于字节顺序吗?所有存储值的内存是否连续?(我知道这vector<bool>实际上并不存储布尔值)。我可以使用 memcopy 将 a 的内容转储vector<bool>到文件中以获取我的值的位图吗?

请不要提出诸如“您需要它做什么”之类的问题或使用 bitset 或 boost 之类的建议。

谢谢你的准确解释

0 投票
5 回答
21044 浏览

c - 查找数据段的地址范围

作为一个编程练习,我正在用 C 编写一个标记和清除垃圾收集器。我希望扫描数据段(全局等)以查找指向已分配内存的指针,但我不知道如何获取该段的地址。我怎么能这样做?