【发布时间】:2016-04-12 00:17:34
【问题描述】:
今天我和一位朋友讨论了静态和动态类型语言之间的区别(更多关于静态和动态类型语言之间区别的信息in this SO question)。在那之后,我想知道在 C++ 中可以使用什么样的技巧来模拟这种动态行为。
在 C++ 中,与其他静态类型语言一样,变量类型是在编译时指定的。例如,假设我必须从文件中读取大量数字,这些数字在大多数情况下都非常小,小到足以放入 unsigned short 类型。棘手的事情来了,这些值中的一小部分要大得多,大到需要存储unsigned long long。
因为我假设我要对所有这些进行计算,所以我希望 所有这些都以与从输入文件中读取它们相同的顺序存储在同一容器中的内存的连续位置中。强>。幼稚的方法是将它们存储在unsigned long long 类型的vector 中,但这意味着通常需要实际需要的空间的4 倍(unsigned short 2 字节,unsigned long long 8 字节)。
在动态类型语言中,变量的类型在运行时解释并强制转换为适合的类型。 如何在 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();
}
}
编辑 1: 问题不是关于节省内存,我知道在动态类型语言中存储示例中数字的必要空间将比在 C++ 中更多,但问题不在于那个,而是关于使用某种 c++ 机制模拟动态类型语言。
【问题讨论】:
-
呃...哪个编译器允许您在
void*上调用delete? -
是的,我知道我不应该……
-
这有一个明显的缺点,即必须同时存储指针,但由于我假设无论如何我都会将它们存储在堆中,所以我认为这并不重要。 i> 如果您正在考虑将数字作为单独的内存分配存储在堆中,我认为在存储数字时使用过多内存的整个问题并不重要。您为此使用的内存比尝试使用不同类型所节省的内存要多得多。
-
另外,警告也很简单:你分配一个短的内存,然后像分配一个长长的内存一样访问该内存。这超出了内存分配的限制,是一件非常糟糕的事情。
标签: c++ c++11 types programming-languages valgrind