gpt4 book ai didi

c++ - 结构/对象内的存储顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:09 25 4
gpt4 key购买 nike

考虑这两种情况:

struct customType
{
dataType1 var1;
dataType2 var2;
dataType3 var3;
} ;

customType instance1;
// Assume var1, var2 and var3 were initialized to some valid values.

customType * instance2 = &instance1;
dataType1 firstMemberInsideStruct = (dataType1)(*instance2);

class CustomType
{
public:
dataType1 member1;
dataType2 member2;

retrunType1 memberFunction1();

private:
dataType3 member3;
dataType4 member4;

retrunType2 memberFunction2();
};

customType object;
// Assume member1, member2, member3 and member4 were initialized to some valid values.

customType *pointerToAnObject = &object ;
dataType1 firstMemberInTheObject = (dataType1) (*pointerToAnObject);

这样做总是安全吗?

我想知道标准是否指定了 - 之间的任何存储顺序

  1. C 结构中的元素。
  2. C++ 类对象中的数据成员。

最佳答案

C99 和 C++ 在这方面有些不同。

C99 标准保证结构的字段将按照它们声明的顺序在内存中布局,并且两个相同结构的字段将具有相同的偏移量。参见 this question对于 C99 标准的相关部分。总结一下:第一个字段的偏移量被指定为零,但之后的偏移量没有被标准指定。这是为了允许 C 编译器调整每个字段的偏移量,以便该字段满足体系结构的任何内存对齐要求。因为这是依赖于实现的,C 提供了一种标准方法来使用 offsetof 来确定每个字段的偏移量。宏。

C++ 仅为 Plain old data (POD) 提供此保证.不能像这样处理不是普通旧数据的 C++ 类。当类使用多重继承、具有非公共(public)字段或成员或包含虚拟成员时,该标准为 C++ 编译器提供了相当多的自由来组织类。

这对您的示例意味着什么:

dataType1 firstMemberInsideStruct = (dataType1)(*instance2);

只有当 dataType1、dataType2 和 dataType3 是普通旧数据时,此行才可以。如果其中任何一个不是,则 customType 结构可能没有平凡的构造函数(或析构函数),并且此假设可能不成立。

dataType1 firstMemberInTheObject = (dataType1) (*pointerToAnObject);

无论dataType1dataType2dataType3是否为POD,这一行都不安全,因为CustomType 类有私有(private)实例变量。这使得它不是 POD 类,因此您不能假设它的第一个实例变量将以特定方式排序。

关于c++ - 结构/对象内的存储顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com