用分层结构和类替换数组可以吗?
Is it fine to replace an array with hierarchal structures and classes?
在我的实现中,我应该使用一个长数组,但我对数组的问题是它的索引对我来说没有多大意义。相反,我想使用分层类。但是,有时我需要以批量方式处理它们,例如在计算差异和导数或平均值时。
所有成员都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;
}
你在diff
所做的事情是一场噩梦。 如果你要做这样的转换,最好坚持使用一个普通的数组来存储你的变量。
但是我会使用您使用结构的想法来帮助您进行计算。
使类成为数组的包装器。 然后代替变量,让它们成为函数 (double size() {... }
)。 在计算中使用这些函数。
像往常一样,总是在过早优化之前进行测量。
编辑:
这是一场噩梦,因为类型是建立起来的,而不是编译器被欺骗去做其他事情。使用"假设"的底层结构,当它不必像某人期望的那样。
这是我要做的一个版本。
好点了吗?它的汇编指令(75 vs 86)比主要示例少。它具有读者可见的预期逻辑。它很容易调试。...
这两个例子必须有基准。但我不认为有太大的差异。
编辑:实际上存在速度差异。下面的代码在GCC,Clang和MSVC上的运行速度比主示例中的代码更快。
快速基准测试
编译器资源管理器示例
#include <iostream>
class Room
{
public:
double size{};
double temperature{};
double humidity{};
double oxigen_level{};
// etc
Room& operator-=( const Room& r )
{
size -= r.size;
temperature -= r.temperature;
humidity -= r.humidity;
oxigen_level -= r.oxigen_level;
return *this;
}
};
class Kitchen
{
public:
double fan_speed{};
double temperature{};
Kitchen& operator-=( const Kitchen& k )
{
fan_speed -= k.fan_speed;
temperature -= k.temperature;
return *this;
}
};
class Building // a hierarchal class
{
public:
static const int room_count{5};
Room rooms[ room_count ];
double distance{};
Kitchen kitchen;
Building operator-( const Building& b )
{
Building ret = *this;
for ( int i = 0; i < room_count; i++ )
ret.rooms[ i ] -= b.rooms[ i ];
ret.distance -= b.distance;
ret.kitchen -= b.kitchen;
return ret;
}
};
int main()
{
Building b1,b2,delta;
b1.rooms[3].humidity=0.44;
b2.rooms[3].humidity=0.43;
delta=b1-b2;//diff(b1,b2);
std::cout
<<"diff: "
<<delta.rooms[3].humidity
<<std::endl;
return 0;
}
相关文章:
- 按平均值替换数组中的元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- C++ 替换字节数组中项的顺序
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 替换 2D 数组中的字符
- 如何在给定文本中用字符数组替换符号
- 用现代C++STL数据结构替换旧的C风格数组
- 查找并替换数组的特定元素
- 如果在执行过程中替换二进制文件,"const"数组是否驻留在内存中?
- 我的函数不会用" "替换".",也不会按预期显示数组
- 用分层结构和类替换数组可以吗?
- 如何替换QT QML中的变体数组文本
- 为什么数据中的随机部分替换了曾经存储在我的角色数组中的其他数据
- C++ 在不使用 C 字符串库函数的情况下替换数组中的字符
- 用另一个1D数组替换2D数组的整个行
- 在函数的输入参数中将 char 数组替换为 std::string
- 用另一个字符数组替换一个字符数组
- 在哪里可以找到如何用函数数组替换"switch"运算符的示例?
- 将内置数组替换为std/tr1/boost::数组是否总是安全的?