加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:32:21 所属栏目:百科 来源:网络整理
导读:对象存储在C中的内存中? 对于一般的班级,如 class Object {public: int i1; int i2; char i3; int i4;private: }; 使用Object作为数组的指针可以用来访问i1,如下所示? ((Object*)myObject)[0] === i1? SO上的其他问题似乎表明,将结构体转换为指针将指向POD
对象存储在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架构的选择可能会使您的假设无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读