Fra*_*101 1 c++ types valgrind programming-languages c++11
今天我和一位朋友讨论了静态和动态类型语言之间的差异(有关静态和动态类型语言在这个SO问题中的区别的更多信息).之后,我想知道在C++中可以使用什么样的技巧来模拟这种动态行为.
在C++中,与其他静态类型语言一样,变量类型在编译时指定.例如,假设我必须从文件中读取大量数字,这些数字在大多数情况下非常小,足够小以适应unsigned short类型.这是一个棘手的问题,少量的这些值要大得多,大到足以需要unsigned long long存储.
由于我假设我要对所有这些进行计算,我希望它们都以相同的顺序存储在相同容器中的相同容器中,而不是从输入文件中读取它们..天真的方法是将它们存储在一个vector类型中unsigned long long,但这意味着通常最多需要4倍于实际需要的空间(unsigned short2个字节,unsigned long long8个字节).
在动态类型语言中,变量的类型在运行时被解释并被强制转换为适合的类型.如何在C++中实现类似的功能?
我的第一个想法是通过指针来做,根据它的大小我会用适当的类型存储数字.这有一个明显的缺点,即必须存储指针,但是因为我认为我还是要将它们存储在堆中,我认为这不重要.
我完全相信你们中的许多人能给我提供比这更好的解决方案......
#include <iostream>
#include <vector>
#include <limits>
#include <sstream>
#include <fstream>
int main() {
std::ifstream f ("input_file");
if (f.is_open()) {
std::vector<void*> v;
unsigned long long int num;
while(f >> num) {
if (num > std::numeric_limits<unsigned short>::max()) {
v.push_back(new unsigned long long int(num));
}
else {
v.push_back(new unsigned short(num));
}
}
for (auto i: v) {
delete i;
}
f.close();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:问题不在于保存内存,我知道在动态类型语言中,在示例中存储数字的必要空间将比在C++中更多,但问题不在于此,而在于动态模拟动态带有一些c ++机制的类型语言.
选项包括......
该代码指定了一组不同的,受支持的类型T0,T1,T2,T3 ......,并且 - 从概念上讲 - 创建一个管理类型
struct X
{
enum { F0, F1, F2, F3... } type_;
union { T0 t0_; T1 t1_; T2 t2_; T3 t3_; ... };
};
Run Code Online (Sandbox Code Playgroud)
因为可以放置到unions中的类型存在限制,并且如果使用放置来绕过它们new需要采取以确保充分对齐和正确的析构函数调用,则通用实现变得更加复杂,并且通常更好地使用boost::variant<>.需要注意的是,type_现场需要一定的空间,union将至少作为最大的大sizeof t0_,sizeof t1_...,并且可能需要填充.
它也可以有一个模板化的构造函数和赋值运算符来调用typeid和记录它std::type_info,允许将来的操作,如"recover-the-value-if-it-a-specific-type".获取此行为的最简单方法是使用boost::any.
您可以使用虚拟析构函数和您需要的任何函数(例如virtual void output(std::ostream&))创建基类型,然后为每个short和派生一个类long long.存储指向基类的指针.
在你的特定场景中,你只有一些大数字:你可以做一些事情,比如将其中一个short值保留为一个标记,表示可以通过按位移位和以下4个值的ORing重新创建此位置的实际值.例如...
10 299 32767 0 0 192 3929 38
Run Code Online (Sandbox Code Playgroud)
......可以编码:
10
299
// 32767 is a sentinel indicating next 4 values encode long long
(0 << 48) + (0 << 32) + (192 << 16) + 3929
38
Run Code Online (Sandbox Code Playgroud)
这里的概念类似于国际字符集的UTF-8编码.这将是非常节省空间的,但它适合前向迭代,而不是随机访问索引a la [123].
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |