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;
coutx
具有与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;i std::cout为什么要这样做?将int
值放在集合或数组中为什么要这样做?将int
值放在集合或数组中对于这样一个没有父类和虚拟函数的结构/类来说,这是有保证的。如果这两个条件中的任何一个都不成立,则所有赌注都是无效的。and成员之间没有访问说明符。对于这样一个没有父类和虚拟函数的结构/类,这是有保证的。如果这两个条件中的任何一个不成立,则所有赌注都无效。并且成员之间没有访问说明符。