【发布时间】:2018-06-19 04:33:51
【问题描述】:
在我的实现中,我应该使用一个长数组,但我对数组的问题是它的索引对我来说没有多大意义。相反,我想使用分层类。但是,有时我需要以批量方式处理它们,例如在计算差异和导数或平均值时。
所有成员都是double,看起来对齐没有任何问题。下面是一个示例。这个例子显然工作正常。
我的问题是这种编程结构是否容易在不同的编译器或系统上失败?
#include <iostream>
class Room
{
public:
double size;
double temperature;
double humidity;
double oxigen_level;
// etc
};
class Kitchen
{
public:
double fan_speed;
double temperature;
};
class Building // a hierarchal class
{
public:
Room rooms[5];
double distance;
Kitchen kitchen;
};
Building diff(
const Building &b1,
const Building &b2) // treat as an array
{
Building r=b2;
double *p1=(double *)&b1;
double *pr=(double *)&r;
for(int i=0;i*sizeof(double)<sizeof(Building);i++)
pr[i]-=p1[i];
return r;
}
int main()
{
Building b1,b2,delta;
b1.rooms[3].humidity=0.44;
b2.rooms[3].humidity=0.43;
delta=diff(b1,b2);
std::cout
<<"diff: "
<<delta.rooms[3].humidity
<<std::endl;
return 0;
}
【问题讨论】:
-
欢迎使用 real 数组:std::vector/std::array.
-
double *p1=(double *)&b1表现出未定义的行为(尽管您很可能会侥幸逃脱)。或者准确地说,p1的后续使用确实如此。 -
因为通常您的程序具有所需的行为。如果你的程序有未定义的行为,你就不能确定你的程序的行为是否符合你想要的行为。它不一定是确定性的
-
"[basic.lval]/8 如果程序试图通过以下类型之一以外的左值访问对象的存储值,则行为未定义..."(后面是一堆情况这些都不适用于
Building/double对)。