问题标签 [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 回答
2785 浏览

c - 了解 C 中数据 bss 段的大小命令

我从size命令中得到了意外的输出。

Afaik 初始化了存储在段中的全局和静态变量data,未初始化并初始化为存储在bss段中的 0 个全局/静态变量。

printf("%d",sizeof(int));给出int大小 4。但是,bssdata并没有相应地增加到 4。

为什么bss增加了 16 (2528 - 2512) 而不是 4?(在上面的代码中)

尽管使用了全局变量,但没有增量bss。为什么?

bss尽管使用了静态变量,但段中没有增量,为什么?

我还有一个问题,dec这里代表什么?

0 投票
2 回答
136 浏览

c++ - 从“子”项指针获取“父”`std::tuple`

如何getParentTuple<TTuple, TItem>符合标准且不依赖于架构的方式实现?

0 投票
1 回答
233 浏览

c++ - 内存布局练习 C++

我正在阅读 B.Stroustrup 的“Programming Principles and Practice Using C++”,并且正在尝试做大部分练习。这个很有趣,我不知道从哪里开始。

练习是:

考虑 17.4 中的布局。编写一个程序,告诉静态存储、堆栈和空闲存储在内存中的布局顺序。堆栈向哪个方向增长:向上朝向更高地址或向下朝向更低地址?

17.4 中的布局:

代码 - 代码的内存

静态数据 - 全局变量的空间

免费存储 - 可用内存

堆栈 - 用于调用函数的内存及其参数和局部变量的空间

我怎么能真正知道这一切发生的顺序?更好的是,我怎么能在它发生时实际输出正在发生的顺序?

它不应该由编译器处理还是我只是误解了这个练习?一些小贴士真的很酷!

谢谢

0 投票
2 回答
142 浏览

c++ - 类层次结构的内存布局

我的目标是创建共享一些公共数据的类层次结构的类的实例。我创建(使用联合)足够的内存,以便可以在分配的内存中创建最大的实例。现在我想创建/交换类的实例并在那里使用内存中的“旧”数据。这是有效/合法的操作吗?

原始代码使用一些 MTP 东西来创建联合,目标是使用这个类层次结构作为状态机实现的核心。我在这里只显示包含问题的基本代码。

我看到如果基类不包含虚方法但派生方法包含,这是一个问题。这是因为 vtable 指针位于内存前面(在 x86/linux 上使用 gcc)。

简单的问题:如果基类的实例是之前创建的并且内存与该派生类的实例一起重用,那么派生类的实例能否访问基类的数据?

0 投票
1 回答
57 浏览

c - 了解动态加载库中的地址

我在foo2中定义了一个函数foo.so,当我动态加载到主程序中时,我尝试了解基地址和函数foo的地址。代码如下:

我希望diff打印输出也应该是恒定的(给定一个固定的共享对象.so)。但打印出来的东西如下;地址diff不固定?

更新:

关闭 ASLR 后,diff 是静态的,但也是base地址。.so 对象总是加载到主程序地址空间中的固定位置/部分是否正常?

0 投票
4 回答
531 浏览

c++ - C++ Struct 编译成类?

我正在研究 C++。我正在使用 MVSV 2010。

当我编译源代码并使用 -d1reportAllClassLayout 转储所有类的内存布局时。

例如,我声明结构:

struct的内存布局如下:

这是否意味着 C++ 编译器在所有方面都认为 struct 与 class 相同?(除了默认访问说明符)

如果是这样,那么struct的构造函数和解构函数呢?

结构是否有默认构造函数和解构函数?它类似于Class?

非常感谢您的支持,

0 投票
1 回答
482 浏览

c - 为什么局部变量在多次运行中更改时全局变量的地址不变?

我在同一台机器上多次运行这个程序。

  1. 每次打印变量的相同地址时ab它都会改变。我知道a会进入该.data部分,因此地址是固定的(如果我错了,请纠正我)但是为什么每次堆栈都会获得不同的地址?
  2. 所有这些地址都是虚拟的。是否可以从这些变量中获取物理地址?
  3. 如果一个全局变量被初始化为零,它会去哪里,BSS 还是数据?
0 投票
3 回答
519 浏览

c++ - 多重继承中保存在vtable c ++中的覆盖虚拟方法在哪里

在 C++ 中,在运行时没有类表示,但我总是可以在派生类中调用重写的虚拟方法。那个被覆盖的方法保存在 vtable 的哪里?这是一段代码来演示:

D 类对象的内存布局是什么?B1::f 和 B2::f 在该内存布局中保存在哪里(如果它们被保存的话)?

0 投票
5 回答
358 浏览

c++ - 如何禁止构造对象?

如何禁止构建对象?我将= delete;所有相关的特殊功能标记如下:

LIVE EXAMPLE

但是xy并且*z仍然可以存在。该怎么办?我对这两种情况都感兴趣;静态/堆栈分配和堆分配。

0 投票
0 回答
1260 浏览

android - Android Linux 内核中的虚拟内存布局

我试图找出内存不足问题的原因。我有一个内核。我正在尝试构建(信息:从飞思卡尔 SabreSD 到 Solidrun Hummingboard,版本 3.10,android 发行版)。我的系统有512MB物理内存。

我的内核使用这个虚拟内存布局启动:

使用以下虚拟内存布局启动工作的3.0.35 内核时:

据我了解,vmalloc 区域太大,lowmem 匹配物理可用内存。我的假设对吗?我应该看什么样的配置?

我试图了解我应该对内核或引导加载程序进行哪些配置更改以修改此内存映射(如果我猜它真的是错误的)。内核忽略命令行vmalloc参数(目前默认是400M,可能是因为至少配置了这么大)。内存布局是在 KConfig 中的某处配置还是在 Uboot 中初始化?你能帮我找出正确的地方吗?

编辑

将 CONFIG_VMSPLIT_2G 更改为 CONFIG_VMSPLIT_3G 后,我可以看到以下内存映射:

但是我在初始化中仍然有一个“内存不足”异常。

这是启动日志的详细信息:

知道我内存不足的原因吗?