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

对象存储在C中的内存中?,第1张

概述对象存储在C中的内存中? 对于一般的班级,如 class Object {public: int i1; int i2; char i3; int i4;private: }; 使用Object作为数组的指针可以用来访问i1,如下所示? ((Object*)&myObject)[0] === i1? SO上的其他问题似乎表明,将结构体转换为指针将 对象存储在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中的内存中?全部内容,希望文章能够帮你解决对象存储在C中的内存中?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1247910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存