问题标签 [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++ - 可变大小的类 - C++
我见过一个类是这样定义的类..
静态工厂函数有以下实现..
据我了解,这个函数使用placement new 来扩展这个类。
这是否只是因为只有 1 个成员并且它是在堆上分配的?
c# - C# 结构中的成员顺序不正确
我有一个 TCP 客户端,它将一个数据包放入一个结构中
我用来将数据包放入结构中的代码是:
现在,在我继续之前,我必须告诉你我正在将这个项目从 C++ 翻译成 C#。
这就是问题:
tPacket_5000_E 的最后 3 个成员是 Int32(我也尝试过 UInt32),它是 C++ 中的 DWORD。这三个成员之前的值,不是Int32,与 C++ 中的值相同。(我在 C++ 和 C# 项目中注入了相同的数据包)。
但是,这三个成员的价值观不同。
在 C++ 中,值是(正确的):
- 种子计数:0x00000079
- 种子CRC:0x000000d1
- 种子安全:
- -[0]:0x548ac099
- - 1:0x03c4d378
- -[2]:0x292e9eab
- -[3]:0x4eee5ee3
- -[4]:0x1071206e
在 C# 中,这些值是(不正确的):
- 种子数:0xd1000000
- 种子CRC:0x99000000
- 种子安全:
- -[0]:0x78548ac0
- - 1:0xab03c4d3
- -[2]:0xe3292e9e
- -[3]:0x6e4eee5e
- -[4]:0x00107120
两个应用程序中的数据包相等
为什么结构中的最后三个成员不同以及如何修复它们?
提前致谢!
c++ - 虚函数和多继承情况下的对象布局
我最近在一次采访中被问及涉及虚拟功能和多重继承的对象布局。
我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入指向虚拟表的秘密指针等等)。
在我看来,我的解释中缺少一些东西。
所以这里有问题(见下面的例子)
- C类对象的确切内存布局是什么。
- C 类的虚拟表条目。
- A、B 和 C 类对象的大小(由 sizeof 返回)。(8、8、16 ??)
- 如果使用虚拟继承会怎样。肯定会影响大小和虚拟表条目吗?
示例代码:
谢谢!
delphi - X的动态数组的Delphi动态数组的内存布局是什么?
我正在尝试从 C# 调用 Delphi DLL 中的过程。该过程期望调用者预先分配并输入一个array of array of TSomeRecord
,然后它将操作其中的TSomeRecord
元素作为返回结果的一种方式。所以,我需要手工制作 X 数组的 Delphi 动态数组。
现在,我在这里发现动态array of X
由指向动态数组的第一个元素的指针组成,并且该第一个元素具有引用计数和长度(元素的数量)数组的前置(都是 32 位整数),并且元素是内联和连续存储的,所以整个事情在内存中看起来像这样:
rrrr 是引用计数,llll 是长度,0123 是元素,而 ^ 是指针指向的位置。这证明了;我已经对其进行了测试,并且可以正常工作。
对于多维动态数组,我假设我可以替换array of Y
in X
,array of X
换句话说,外部维度只是动态数组(指向)的动态数组,如下所示:
其中元素 0000、1111 等现在是指向独立分配的动态数组的 32 位指针。但是,这样做会因为我的麻烦而导致访问冲突。这显然不是 Delphi 期望我做的。谁能向我解释我应该怎么做?
c - C中的结构内存布局
我有 C# 背景。我是 C 等低级语言的新手。
在 C# 中,struct
默认情况下, 的内存由编译器布局。编译器可以重新排序数据字段或隐式填充字段之间的附加位。因此,我必须指定一些特殊属性来覆盖此行为以实现精确布局。
struct
AFAIK,默认情况下,C 不会重新排序或对齐 a 的内存布局。但是,我听说有一个很难找到的小例外。
C 的内存布局行为是什么?什么应该重新排序/对齐而不是?
linux - 为什么 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?
在 Ubuntu x86 系统上反汇编 ELF 二进制文件我不禁注意到代码(.text)部分从虚拟地址 0x8048000 开始,并且所有较低的内存地址似乎都未使用。
这似乎相当浪费,所有谷歌出现的要么是涉及 STACK_TOP 的民间传说,要么是针对空指针取消引用的保护。后一种情况看起来可以通过使用单个页面而不是留下 128MB 的间隙来修复。
所以我的问题是——对于为什么布局被固定为这些值或者它只是一个任意的选择,有一个明确的答案吗?
c++ - 使用 g++ 编译器打印 C++ 对象的布局
有没有办法使用 g++ 编译器或任何其他方式打印 C++ 对象的布局。一个简化的例子(假设 int 需要 4 个字节)
所以输出将是
了解对象的布局(在我的例子中是虚拟机代码)会很有用。
提前致谢。
问候,扎希尔
c++ - 一个类的对象(使用单/多继承)将有多少个 vptr?
一个对象的 clas(child) 与一个多重继承 base1 和 base2 的基类具有单继承关系,通常需要多少个 vptr。确定一个对象提供了多少个 vptr 的策略是什么,它具有一对单继承和多继承。虽然标准没有具体说明 vptrs 但我只想知道一个实现是如何实现虚拟功能的。
vector - 矢量的内存布局
有人可以解释存储在 a 中的数据的内存布局vector<bool>
吗?
就像内存从地址&myVec[0]
向上有什么布局?它取决于字节顺序吗?所有存储值的内存是否连续?(我知道这vector<bool>
实际上并不存储布尔值)。我可以使用 memcopy 将 a 的内容转储vector<bool>
到文件中以获取我的值的位图吗?
请不要提出诸如“您需要它做什么”之类的问题或使用 bitset 或 boost 之类的建议。
谢谢你的准确解释
c - 查找数据段的地址范围
作为一个编程练习,我正在用 C 编写一个标记和清除垃圾收集器。我希望扫描数据段(全局等)以查找指向已分配内存的指针,但我不知道如何获取该段的地址。我怎么能这样做?