memory-layout相关内容
有没有办法使用 g++ 编译器或任何其他方式打印 C++ 对象的布局.一个简化的例子(假设 int 占用 4 个字节) A 类{诠释一个;};B类:公共A{诠释 b;} 所以输出将是 A-0 4+ 一个 +乙-0 4 8+ A.a + b + 了解对象的布局会很有用(在我的例子中是虚拟机代码). 提前致谢. 问候,扎西尔 解决方案 看手册页,-fdump-class-h
..
在 Java 8 之前,我们有 5 个主要的运行时数据区: 方法区 堆 JVM 堆栈 PC 寄存器 本机方法堆栈 在 Java 8 中,没有 Perm Gen,这意味着没有更多“java.lang.OutOfMemoryError: PermGen" 这很好,但我也读过 方法区是 Perm Gen 中空间的一部分 但我似乎找不到任何明确说明 Java 8 中不
..
跟进为什么ELF执行入口点虚拟地址是0x80xxxxx而不是0x0形式的0x0? 和 为什么虚拟内存地址为linux 二进制文件从 0x8048000 开始?,为什么我不能让 ld 使用与 ld -e 的默认入口点不同的入口点? 如果这样做,我会得到一个返回代码为 139 的 segmentation fault,即使对于靠近默认入口点的地址也是如此.为什么? 编辑: 我会让问题
..
在 Ubuntu x86 系统上反汇编 ELF 二进制文件 我不禁注意到 code(.text) 部分从虚拟地址 0x8048000 开始,所有较低的内存地址似乎都未使用. 这似乎相当浪费,所有谷歌出现的要么是民间传说涉及 STACK_TOP 或防止空指针取消引用.后一种情况看起来可以通过使用单个页面而不是留下 128MB 的间隙来修复. 所以我的问题是 - 是否有明确的答案来解释为什
..
似乎在Windows 32位上,内核会从总共4G的用户虚拟内存空间中预留1G的虚拟内存,并将部分的内核空间映射到这1G空间中. 所以我的问题是: 在 32 位 Linux 上有没有类似的情况? 如果是这样,我们如何才能看到整个内存布局? 我觉得 cat/proc/pid/map 只能看到某个进程的用户空间布局.. 谢谢! 解决方案 其实在 32 位 Windo
..
作为一个编程练习,我正在用 C 编写一个标记和清除垃圾收集器.我希望扫描数据段(全局变量等)以获取指向已分配内存的指针,但我不知道如何获取该段的地址范围.我怎么能这样做? 解决方案 Linux(和其他 unix)的文本(程序代码)和数据边界: #include #include /* 这些不在头文件中,并且在某些系统,他们有一个 _ 前置必须输入这些符号以使编译器满意另请查看 brk()
..
基本上,如果我有 typedef struct {整数 x;输入 y;} 一个;类型定义结构{INT H;国际 k;乙; 而且我有 A a,C 标准是否保证 ((B*)&a)->k 与 ay 相同? 解决方案 是否保证具有相同成员类型的 C 结构在内存中具有相同的布局? 几乎是的.对我来说足够接近了. 来自 n1516,第 6.5.2.3 节,第 6 段: ...
..
考虑以下事项: //只是一系列相同类型的相邻字段#[repr(C)]#[派生(调试)]结构 S T{在,乙:T,时间:T,d : t,}impl科技{fn new(a : T, b : T, c : T, d : T) ->自己 {自己 {一种,乙,C,d、}}//将其重新解释为数组fn as_slice(&self) ->&[T] {不安全 { std::slice::from_r
..
据我所知,Rust 编译器可以对结构的每个字段进行打包、重新排序和添加填充.如果需要,如何指定精确的内存布局? 在 C# 中,我有 StructLayout 属性,而在 C/C++ 中,我可以使用各种编译器扩展.我可以通过检查期望值位置的字节偏移量来验证内存布局. 我想使用自定义着色器编写 OpenGL 代码,这需要精确的内存布局.有没有办法在不牺牲性能的情况下做到这一点? 解决
..
考虑以下简单结构: 结构A{浮动数据[16];}; 我的问题是: 假设平台上的 float 是32位IEEE754浮点数(如果很重要),使用C ++标准保证 struct A的预期内存布局 ?如果没有,它能保证什么和/或什么是强制执行保证的方式? 通过期望的内存布局,我的意思是该结构占用内存中的 16 * 4 = 64 个字节,每个连续的 4 个字节均被占用通过 data 数组中
..
我试图从超长字符数组生成三元组数组(即连续三个字母的组合): #数据实际上是从源文件加载的a = np.random.randint(0,256,2 ** 28,'B').view('c') 由于复制效率不高(并且会产生诸如高速缓存未命中之类的问题),因此我使用跨步技巧直接生成了Trigram: tri = np.lib.stride_tricks.as_strided(a,(len(a
..
为什么当我在gdb中调试asm源时是0x8048080为代码的起始入口点选择的地址?这只是相对偏移量,而不是指令存储器中的实际偏移量,对吗? 解决方案 地址0x8048080没有特殊意义,但地址0x08048000有一个特殊含义. 后一个地址是默认地址,在Linux/x86上,ld在该默认地址上开始第一个PT_LOAD段.在Linux/x86_64上,默认值为0x400000,您可以
..
对于C编译器,数组元素是按列主要顺序还是行主要顺序存储,还是依赖于编译器? int arr [2] [3] = {1,2,3,4,5,6}; int array [3] [2] = {1,2,3,4,5,6}; 关于打印arr和数组输出: arr: 1 2 3 4 5 6 数组: 1 2 3 4 5 6
..
我将数据以数组结构(SoA)或指针结构(SoP)的形式布置在内存中,并且有一种访问该数据的方式,就好像它是以结构数组(AoS)的形式布置一样- -下面给出的代码. 但是,我对使用struct AoS_4_SoP不太满意-尽管此struct似乎使用模板,但它并不是通用的,因为例如foo和bar在内部进行了硬编码它. 两个问题/要求: 1)为了实现读写性能,AoS访问是否与直接SoA
..
我知道此答案违反了我相信这并不能保证,但是当我搜索标准时,我发现自己的信心开始动摇.如果我静态分配2D数组,像这样: int foo[][4] = { { 5, 7, 8 }, { 6, 6 }, {}, { 5, 6, 8, 9 } }; 我可以假设所有元素都是线性分配的吗?也就是说,
..
我知道类外部的常量变量可以由编译器直接优化为函数调用,但是对于常量类变量而言,编译器执行相同操作合法吗? 如果有一个这样声明的类: class A { public: const int constVar; //other, modifiable variables A(int val): constVar(val) { //code to initiali
..
如果我有两个类,一个类继承自另一个类,而子类仅包含函数,那么两个类的内存布局是否相同? 例如 class Base { int a,b,c; }; class Derived: public Base { // only functions. }; 我已阅读到编译器无法对数据成员进行重新排序,并且我不需要对Derived类进行多重继承.有什么情况下内存布局会不同吗? (B
..
在此代码中,ob1的大小为16,这很好(由于虚拟指针),但我不明白为什么ob2的大小为24. #include using namespace std; class A { int x; }; class B { int y, z; }; class C : virtual public A { int a; }; class D : virtu
..
考虑这个愚蠢的枚举: enum Number { Rational { numerator: i32, denominator: std::num::NonZeroU32, }, FixedPoint { whole: i16, fractional: u16, }, } Rational变量
..
我阅读了以下问题: C ++虚拟类继承对象大小问题,并且想知道为什么虚拟继承会在类中导致附加的vtable指针. 我在这里找到了一篇文章: https://en.wikipedia.org/wiki/Virtual_inheritance 告诉我们: 但是,通常只能在运行时知道此偏移量,... 我在这里不了解与运行时相关的内容.完整的类继承层次结构在编译时就已为人所知.我了
..