问题标签 [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++ - 基类中的虚拟继承和空vtable
有这个代码:
我已经读过,当某个类被虚拟继承时,会为 Derived 类创建空 vtable,因此内存布局如下:
它是 12 个字节。问题是 -如果没有任何虚拟方法,这个空vtable 的用途是什么?它是如何使用的?
linux - 将可执行文件中的变量映射到内存段
Linux中是否有一个工具可以将可执行文件中的不同变量映射到相应的内存段。
例如,如果我的可执行文件中有一个已初始化的全局变量,该工具应该以类似于下图所示的格式int x = 10
显示该变量属于可执行文件的段。.data
x .data
c++ - xcode中的对象字节对齐
有没有办法在 Xcode 中获取类实例的编译时字节对齐?在 Visual Studio 中有一个标志(/d1reportSingleClassLayoutXXX,其中 XXX 是类名),它将类布局转储到输出窗口。Xcode 中是否有类似的标志/功能?
像这样除了使用llvm。
clr - 将 Numeric.Complex 与 PInvoke 一起使用是否安全?(它没有 LayoutKind.Sequential)
我想在非托管 PInvoke 场景中使用 System.Numerics.Complex。使用 ILSpy,我注意到它没有分配 LayoutKind.Sequential 属性。
在不转换为期望公共内存布局的本机函数的情况下给出指向 Complex[] 数组的指针是否安全,即:实数第一,虚数第二?或者,CLR 是否会因为某种原因打乱它的真实和虚构属性?
c++ - 为什么 virtual 关键字会增加派生类的大小?
我有两个类 - 一个基类和一个派生自它:
这里的答案是 16。但是如果我改为使用非虚拟公共继承或使基类非多态,那么我得到的答案是 12,即如果我这样做:
或者
在这两种情况下,答案都是 12。
有人可以解释为什么派生类的大小在第一种和其他两种情况下有所不同吗?
(我在 code::blocks 10.05 工作,如果有人真的需要这个)
c - 文本区域的大小
考虑以下程序:
当我运行以下命令时:
我得到的输出为:
由于文本区域包含程序的可执行指令,为什么输出显示文本区域的大小为 960,据我所知,这相对于指令的大小来说太大了。
c++ - 继承的C++内存布局
如果我有两个类,一个从另一个继承,而子类只包含函数,那么两个类的内存布局是否相同?
例如
我读过编译器不能重新排序数据成员,我不需要Derived
类的多重继承。有没有内存布局不一样的情况?(类可能需要多重继承Base
)
c++ - 当基类不是多态而是派生时,“this”地址不匹配是
有这个代码:
输出:
但是,当 Derived 类中的函数 'fun' 更改为 virtual 时:
那么'this'的地址在两个构造函数中都不相同:
另一件事是如果类 Base 是多态的,例如我添加了一些其他虚函数:
然后两个“this”的地址再次匹配:
问题是 - 当基类不是多态而派生类是多态时,为什么基类和派生类中的“这个”地址不同?
c++ - 多重虚拟继承中的虚拟表和内存布局
考虑以下层次结构:
实例的确切内存布局是什么?
C
它包含多少个 vptr,每个 vptr 的确切放置位置?哪些虚拟表与 C 的虚拟表共享?每个虚拟表究竟包含什么?这里我是如何理解布局的:
where
AptrOfBx
是指向包含A
实例的指针Bx
(因为继承是虚拟的)。
那是对的吗?vptr1
指向哪些功能?vptr2
指向哪些功能?给定以下代码
为什么所有的电话都
f
打印33
?
c++ - 联合内的位域对齐
我对以下代码如何在内存中布局感到有些困惑:
在 Linux 上的 gcc 3.3、4.3 或 4.6 上(没有我能想到的任何特殊选项 - 只有 4.6 上的“-Wall -g”),结构的大小始终为 4:
我们在这里有一些类似的代码,其中我们在结构中具有无符号值:24,并且有人添加了联合并无意中将结构的大小从 3 个字节增加到了 4 个字节。如果我尝试将联合定义为“打包”,也会发生同样的事情 - 大小仍然是 4。这种行为是否符合 C++ 规范?会有什么解释?
稍后编辑:将“C 规范”替换为“C++ 规范”。