gpt4 book ai didi

c++ - 通过指针运算访问结构体数据成员

转载 作者:行者123 更新时间:2023-12-02 20:52:16 24 4
gpt4 key购买 nike

如果我有一个像这样的简单张量类

struct Tensor
{
double XX, XY, XZ;
double YX, YY, YZ;
double ZX, ZY, ZZ;
}

使用指针算术(见下文)访问其元素是否是未定义的行为?

 double& Tensor::operator[](int i) 
{
assert(i < 9);
return (&XX)[i];
}

最佳答案

是的,这是未定义的行为。

数据成员不在数组中,因此不能保证像指针算术所要求的那样连续存储在连续内存中。它们之间可能会生成不确定的填充。

正确的方法是单独访问成员,例如:

double& Tensor::operator[](int i)
{
switch (i)
{
case 0: return XX;
case 1: return XY;
case 2: return XZ;
case 3: return YX;
case 4: return YY;
case 5: return YZ;
case 6: return ZX;
case 7: return ZY;
case 8: return ZZ;
default: throw std::out_of_range("invalid index");
}
}

或者,如果您确实想使用数组语法:

double& Tensor::operator[](int i)
{
if ((i < 0) || (i > 8))
throw std::out_of_range("invalid index");

double* arr[] = {
&XX, &XY, &XZ,
&YX, &YY, &YZ,
&ZX, &ZY, &ZZ
};

return *(arr[i]);
}

或者

double& Tensor::operator[](int i)
{
if ((i < 0) || (i > 8))
throw std::out_of_range("invalid index");

static double Tensor::* arr[] = {
&Tensor::XX, &Tensor::XY, &Tensor::XZ,
&Tensor::YX, &Tensor::YY, &Tensor::YZ,
&Tensor::ZX, &Tensor::ZY, &Tensor::ZZ
};

return this->*(arr[i]);
}

否则,使用实际的数组作为数据,并定义方法来访问元素:

struct Tensor
{
double data[9];

double& XX() { return data[0]; }
double& XY() { return data[1]; }
double& XZ() { return data[2]; }
double& YX() { return data[3]; }
double& YY() { return data[4]; }
double& YZ() { return data[5]; }
double& ZX() { return data[6]; }
double& ZY() { return data[7]; }
double& ZZ() { return data[8]; }

double& operator[](int i)
{
if ((i < 0) || (i > 8))
throw std::out_of_range("invalid index");
return data[i];
}
};

关于c++ - 通过指针运算访问结构体数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428562/

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