内存分配相同的结构

IAE*_*IAE 2 c++ struct pointers

所以我正在教我的朋友指点.在这样做时,我注意到两个相同结构的地址完全背靠背.

struct Foo
{
    int a;
};

struct Bar
{
    int b;
};
Run Code Online (Sandbox Code Playgroud)

这让我这样做:

Foo foo; foo.a = 100;
Bar bar; bar.b = 100;

Foo *pFoo = &foo;
Bar *pBar = &bar;

(pFoo+1)->a = 200;
Run Code Online (Sandbox Code Playgroud)

这将覆盖bar.b中的值并将其设置为200.

现在,我并没有质疑做这样的事情的优点 - 它可能永远不会在真正的节目中看到光明.我只是想知道,操作系统是否总是背靠背地分配相同的结构?只要给定区域有足够的可用内存空间.

Dav*_*ter 8

不,不一定.某些体系结构/编译器可能会在边界上对齐结构,使得数组中的结构与调用堆栈上的结构之间存在不同的间距.你在调用堆栈上分配并将它们视为一个连续的数组,这是一个不可靠的假设.


Pau*_*ter 6

操作系统不会为本地变量分配堆栈空间,编译器会这样做.C++编译器不保证分配顺序.

  • @SoulBeaver - 程序向操作系统询问内存,但他们没有说明内存中发生了什么.因此操作系统不知道是否在堆栈上分配了两个相同的结构.实际上,程序只能在页面大小的块中请求空间,并且页面通常是4096字节长,因此两个结构可能同时分配,并且程序确定内存如何对应于结构. (2认同)
  • @DeadMG:将"C"更改为"C++"是否会实质性地改变答案的内容? (2认同)