提问者:小点点

铸造已定义(已知)内存的相邻内存


让这个矩阵被认为是一个记忆。

                                        p00 p01 p02 p03 p04 p05 p06.... p0n
                                        p10 p11 p12 p13 p14 p15    .... p1n
                                        .   .   P22 .   .   .      .... p2n
 Abstraction of the memory              .   .   .   .   .   .      .... .
                                        .   .   .   .   .   .      .... .
                                        .   .   .   .   .   .      .... .
                                        .   .   .   .   .   .      .... pnn

P01是一种已知的情况,它存储一个int

例如:

int *int_ptr;
int var{42};

int_ptr = &var;

/*Working*/

现在,我想在p02(靠近p01)存储一个char,这样就可以找到一个逻辑,并且我们可以推导出下一个起始地址(&var+sizeof(decltype(var)))

那么,我们如何为不同类型(不同大小)保留下一个大小写,使用指针(或引用),并强制转换它呢?

int *int_ptr;
int  i_value{42};
char c_value{'c'};

int_ptr = &var;

/*How can we store the char data juste near the int one*/

编辑:删除未使用的动态内存分配(泄漏)int*int ptr=new int,@eljay更正


共1个答案

匿名用户

你不能,你也不想。

>

  • 您不能决定对象的位置; 运行时会这样做(间接地,操作系统也会这样做)。 它比你更善于高效地安排事情。

    使用指针算术以这种方式“到达”另一个对象具有未定义的行为。 你不能像那样浏览内存空间。

    人们很容易把所有的东西都看作“只是字节”,但这并不是真的(C++是一种抽象),除非您想要接受各种优化,以生成一个在相当长的时间内运行的程序,否则您必须遵守规则。

    您只能使用指针算术在对象数组中导航(如果由于某种原因使用别名,则可以包括组成单个对象的char隐式数组)。

    如果您迫切需要内存局部性(因为您已经通过度量确定了您确实需要它),那么将您的对象放在一个类中,使它们在内存中大致相邻。

    而且,你的榜样是坏的; 您分配了一个int,然后丢弃指向它的指针,将指针设置为局部变量的地址,然后尝试delete局部变量。 这里面没有任何价值(或意义)。