微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对象存储在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架构的选择可能会使您的假设无效.

原文地址:https://www.jb51.cc/c/114450.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐