问题标签 [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++ - linux中的程序内存布局
我对程序在内存中的样子有点困惑,我的教授告诉我堆栈和堆相互增长,堆栈位于较低的内存地址。
该图像困扰我的第一件事是,如果堆从高到低增长,那么如果我在堆上分配了一个数组,那么指向第二个元素的指针的 int 值是否应该小于指向第一个元素的指针?这会令人困惑
我做了一些研究,发现了这个数字(注意我的问题集中在 linux 上)
(来源:cyberplusindia.com)
好的,所以数据和未初始化的数据出现在文本段之后,位于程序内存的开头,然后是堆,然后是堆栈,最后是命令行参数和环境。
但是如果堆栈从高地址增长到低地址,那么如果我在堆栈上分配了一个数组,那么指向第一个元素的指针的值也会低于指向第二个元素的指针的值吗?这是否意味着堆栈也会从低到高增长?
所以我的问题是 Linux 中进程的正确内存布局是什么?以及共享库的内存来自哪里(在进程的地址空间中)
带有指针示例的简单代码:
输出:
java - 另一个内部类的内部子类 - 根类有多少引用?
假设我有结构
似乎C
应该有两个对根类的引用A
:第一个是从B
超类继承的,第二个是自己的隐式内部类引用。我的问题:JVM(HotSpot)是否优化了这种情况并只保留一个对根类的引用?
c++ - 结构对齐 C/C++
在 c/c++ 中(我假设它们在这方面是相同的),如果我有以下内容:
下面的内容能保证是真的吗?
或者换句话说,是否有任何保证在第一个成员之前不会有填充?
linux - 多线程进程的内存布局
好吧,我知道所有向上增长的线程都有一个共同的堆,并且我们为每个向下增长的线程都有堆栈(真的是这样,堆栈向下增长还是只是一个简单的视图?)。我什至在某处读到堆栈可以成为堆空间的一部分。
这些堆栈是如何放置的?一个高于另一个?如果顶部的堆栈溢出并试图写入它下面的堆栈会发生什么?真的是这样吗?请详细查看。
java - Can we implement a C++ style list in Java?
An arrayList in Java "holds" references to the Objects and not the actual Object data.
I was wondering if we can implement an arrayList in Java that can contain the Object data directly instead of references. Can Java Unsafe Class be used for this implementation? If yes, what would be the performance of this list in comparison to the existing Java arrayList?
python - numpy数组的缓冲区分区
在 Matlab 中,矩阵的缓冲区在列中是连续的。那么 Python 的 numpy 数组呢?numpy.empty((n,1))
和之间哪个更好numpy.empty((1,n))
c - 澄清 C 中的位域排序语义
我很难理解关于位域(6.7.2.1:10)的一段 C99 草案标准(N1256)的确切含义:
6.7.2.1 结构和联合说明符
[...]
语义
[...]
实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间,结构中紧跟在另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
强调的句子将我的英语技能发挥到了极限:我不明白它是指一个单元内的单个位域,还是指单个位域内的位排序或其他东西。
我会试着用一个例子让我的疑问更清楚。假设无符号整数是 16 位,实现选择无符号整数作为可寻址存储单元(并且字节为 8 位宽),并且不会出现其他对齐或填充问题:
因此,假设x
和y
字段存储在同一个单元内,那么根据那句话实现定义是什么?据我了解,这意味着在该 unsigned int 单元内部,x
可以存储在低于y
或反之亦然的低地址,但我不确定,因为直觉上我认为如果没有位字段与两个底层重叠存储单元,声明顺序将对底层位字段施加相同的顺序。
注意:我担心我在这里遗漏了一些微妙的术语(或者,更糟糕的是,一些技术术语),但我不明白是哪个。
任何指针表示赞赏。谢谢!
c++ - 数据成员的编译时重新排列?
我想知道一种可能的方法来使类的内存布局在模板化代码中更有效。据我所知,标准要求类的数据成员按照声明的顺序排列在内存中。编译器可能会进行填充以对齐数据成员,从而不必要地增加类的大小。这个想法是在编译时重新排列数据成员声明以最小化这种填充。我做了一些搜索,但找不到任何信息(大多数时候人们讨论打包编译器指令,这与我看到的不太一样)。
首先,请考虑以下(琐碎但重复且丑陋的)代码(ideone.com 上的相同代码)(问题在代码下方,请随意跳至它们):
程序输出:
问题:
- 是否有一些众所周知的、独立于编译器的方法来解决此类问题(也许是 Boost)?
- 如果不是,是否有一些特定于编译器的指令会自动执行此类操作(没有 GCC 的数据错位
__atribute__((packed))
)? - 这可以以更通用的方式完成(可能使用可变参数模板)吗?
提前致谢!
memory - 内存布局解读
在此页面上,有一个程序的部分内存布局的示例图像:
这种图像中的每一行代表什么?每行是否代表单行物理内存?通常物理内存有 32 位或 64 位作为每一行,那么在这种情况下,图像中的每一行是否覆盖了几行物理内存?
谢谢。
c - 具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?
本质上,如果我有
我有A a
,C 标准是否保证((B*)&a)->k
与 相同a.y
?