对象存储在C中的内存中?

对象存储在C中的内存中?

对于一般的班级,如

class Object
    {
public:
    int i1;
    int i2;
    char i3;
    int i4;
private:
    };

使用Object作为数组的指针可以用来访问i1,如下所示?

((Object*)&myObject)[0] === i1?

SO上的其他问题似乎表明,将结构体转换为指针将指向POD类型的第一个成员.对于具有构造函数的类,如果有的话,这是不同的?
同样,对于非POD类型来说,它有什么不同?

编辑:

因此,在记忆中,上述课程的布局如下:

[i1 - 4bytes][i2 - 4bytes][i3 - 1byte][padding - 3bytes][i4 - 4bytes]

解决方法

几乎.你投射到一个对象*,而忽略了一个地址.让我们重新询问一下:
((int*)&myObject)[0] == i1

你必须非常小心这样的假设.正如您定义的结构一样,在您可能遇到的任何编译器中都应该这样做.但是,与其他人所说的对象的各种其他属性(您可能从示例中可能省略)将使其成为非POD,并且可能(以编译器依赖的方式)使上述语句不成立.

请注意,如果您询问了i3,我将不会那么快速地告诉您它会工作,在这种情况下,即使是普通的POD,对齐方式或字节顺序也可能很容易使您失望.

无论如何,如果可能,你应该避免这种事情.即使现在工作正常,如果您(或任何其他人不了解您正在做这个技巧)也改变了结构顺序或添加了新的领域,这个伎俩将在你使用它的所有地方失败,这可能很难找到.

回答你的编辑:如果这是你整个类的定义,而你正在使用认选项的主流编译器之一,并在x86处理器上运行,那么是的,你可能猜到了正确的内存布局.但编译器,编译器选项和不同cpu架构的选择可能会使您的假设无效.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...