C++ 对象是否按顺序存储变量?

C++ 对象是否按顺序存储变量?,c++,C++,您可以使用类成员变量上的指针来递增或递减任何变量吗?或者为什么不呢 例如,结构或类 struct MyStruct { int x; int y; int z; }; int main() { MyStruct Obj; int *p = &Obj.x; cout << *p << endl; cout << p++ << endl; cout << p++ <<

您可以使用类成员变量上的指针来递增或递减任何变量吗?或者为什么不呢

例如,结构或类

struct MyStruct {
   int x;
   int y;
   int z;
};

int main()
{
   MyStruct Obj;
   int *p = &Obj.x;

   cout << *p << endl;
   cout << p++ << endl;
   cout << p++ << endl;
}
struct MyStruct{
int x;
int-y;
intz;
};
int main()
{
MyStruct Obj;
int*p=&Obj.x;

cout
x
具有与
Obj
相同的地址-这对于没有父类或虚拟成员的结构是有保证的。
x
y
z
在内存中保持顺序,这也是有保证的。结构成员之间可能有填充,这是特定于实现的,因此您无法safely假设您的代码是可移植的。

x
具有与
Obj
相同的地址-这对于没有父类或虚拟成员的结构是有保证的。
x
y
z
在内存中保持顺序,这也是有保证的。结构成员之间可能有填充,这是简单的特定于修订,因此您不能安全地假设您的代码是可移植的。

通常它是按顺序存储的,您可以阅读。但我认为不可能按照您的建议执行,因为这不是一个普遍的事实。

通常它是按顺序存储的,您可以阅读。但我认为不可能按照您的建议执行G因为这不是一个普遍的事实。

非常肯定这不是保证的行为。也就是说,你可能会找到一些发生这种情况的例子,但我不相信这是ANSI标准的一部分,所以结果可能会有所不同。

非常肯定这不是保证的行为。也就是说,你可能会找到一些发生这种情况的例子,但我不认为这是ANSI标准的一部分,因此结果可能会有所不同。

变量可能有不同的大小,不同的成员变量之间可能有填充空间,因此像您的示例中那样简单地递增指针通常不起作用。

变量可能有不同的大小,并且可能有填充空间在不同的成员变量之间增加空格,因此像您的示例中那样简单地增加指针通常不起作用。

这不是保证行为;指针算法仅在数组对象中定义。根据标准:

如果指针操作数和 结果指向相同的元素 数组对象,或超过最后一个 数组对象的元素 评估不应产生任何结果 溢出;否则,该行为为 未定义


这不是保证行为;指针算法仅在数组对象中定义。根据标准:

如果指针操作数和 结果指向相同的元素 数组对象,或超过最后一个 数组对象的元素 评估不应产生任何结果 溢出;否则,该行为为 未定义


正如其他人所说,你不能可靠地做到这一点。你可以做到以下几点:

size_t offsets[] = {
    offsetof(MyStruct, x),
    offsetof(MyStruct, y),
    offsetof(MyStruct, z) };
size_t size_offset = sizeof offsets / sizeof offsets[0];

for (size_t i = 0; i < size_offsets; ++i)
    std::cout << *(&Obj + offsets[i]) << std::endl;
size\u t offset[]={
偏移量(MyStruct,x),
抵销(我的结构,y),
offsetof(MyStruct,z)};
size_t size_offset=sizeof offset/sizeof offset[0];
对于(大小i=0;i正如其他人所说,你不能可靠地做到这一点。你可以做到以下几点:

size_t offsets[] = {
    offsetof(MyStruct, x),
    offsetof(MyStruct, y),
    offsetof(MyStruct, z) };
size_t size_offset = sizeof offsets / sizeof offsets[0];

for (size_t i = 0; i < size_offsets; ++i)
    std::cout << *(&Obj + offsets[i]) << std::endl;
size\u t offset[]={
偏移量(MyStruct,x),
抵销(我的结构,y),
offsetof(MyStruct,z)};
size_t size_offset=sizeof offset/sizeof offset[0];
对于(大小i=0;istd::cout为什么要这样做?将
int
值放在集合或数组中为什么要这样做?将
int
值放在集合或数组中对于这样一个没有父类和虚拟函数的结构/类来说,这是有保证的。如果这两个条件中的任何一个都不成立,则所有赌注都是无效的。and成员之间没有访问说明符。对于这样一个没有父类和虚拟函数的结构/类,这是有保证的。如果这两个条件中的任何一个不成立,则所有赌注都无效。并且成员之间没有访问说明符。