【发布时间】:2013-10-27 06:06:13
【问题描述】:
考虑下面的三个代码块,字符串/联合冲突的三个替代解决方案。
在这些选项中,一般来说,以这种方式使用联合的内存效率更高?
我在这里寻找解决原则的答案:也就是说,联合的主要目的是节省内存。
编辑:课堂作业迫使我以这种方式使用联合。它让我思考哪个是最有效的,这就是我到达这里的原因。
代码块(A):
// unions with pointers to structs
struct HourlyInfo {
string firstName;
string lastName;
string title;
int hoursWorked;
double hourlyRate;
};
struct SalaryInfo {
string firstName;
string lastName;
string title;
double salary;
double bonus;
};
struct Employee {
bool isHourly;
union {
HourlyInfo *hourlyEmployee;
SalaryInfo *salaryEmployee;
}
};
代码块(B):
// applying unions to relevant and non-string data types
struct Employee {
string firstName;
string lastName;
string title;
bool isHourly;
union {
struct {
double hourlyRate;
int hoursWorked;
} hourly;
struct {
double salary;
double bonus;
} salaried;
};
};
代码块 (C):
// use cstring instead of string
struct HourlyInfo {
cstring firstName[50];
cstring lastName[50];
string title[50];
int hoursWorked;
double hourlyRate;
};
struct SalaryInfo {
cstring firstName[50];
cstring lastName[50];
cstring title[50];
double salary;
double bonus;
};
struct Employee {
bool isHourly;
union {
HourlyInfo hourlyEmployee;
SalaryInfo salaryEmployee;
}
};
(注意:代码背后的想法是任何员工要么是小时工,要么是薪水,因此这里是工会。请不要为这个问题提出不涉及工会的替代解决方案。我不担心解决一个具体问题,我对工会感兴趣。)
此外,指针和其他数据类型的大小似乎差异很大:
What does the C++ standard state the size of int, long type to be?
How much memory does a C++ pointer use?
这是否意味着我们不能在这里就内存效率做出一概而论的陈述?如果是这样,在确定最有效的方法时我们应该考虑哪些因素?
【问题讨论】:
-
您并没有真正进行公平的比较,因为 A 和 C 还需要一个 bool 来识别工会的哪个成员是活动的。
-
在union之前你算过内存大小了吗?你知道 std::string 是如何工作的吗?为什么你有50个?什么是字符串?
const char*? -
你的目标是什么?为什么不
class Employee {...}; class HourlyEmployee : public Employee {...}; class SalaryEmployee : public Employee {...}等? -
“请不要为这个问题提出不涉及联合的替代解决方案”——联合是一个问题,而不是一个解决方案。
-
@sehe 好点。我会尝试在问题中更清楚地说明这一点。这确实是出于好奇。
标签: c++ pointers memory unions