关于指针和动态内存的一般问题
A general question about pointers and dynamic memory
我目前正在处理写入多个文件的总计 21 兆字节的纯文本数据。它由一些字符串和整数组成。正确地包含它们对我来说很重要,因为我能够以各种方式遍历它们,所以我为我的容器使用了相当复杂的 typedef
,例如
typedef std::tuple<std::string,
std::array<time_t, 12>,
std::array<std::map<std::vector<UINT>, bool>, 4>> cont;
我在最后一步将数据放入 std::vector<cont*> v
。我的用法在逻辑上可行吗?我曾经读到 OS 为每个可执行文件的堆栈内存保留 1 兆字节的内存。是真的吗?假设我的数据急剧增加。在我的系统中,诸如此类的指针无论指向什么,其大小都是 8 个字节。这是有道理的,因为它们只是某种指向内存中某处的整数,它们可以被认为是普通的 long long int
。现在假设堆栈内存为 1 兆字节,并且将 131072 个指针插入该向量可能会填满它,因为向量本身是在堆栈中分配的。那么对于这样一个抽象的场景,正确的做法是什么?在堆中也分配这个向量本身就足够了吗?我的意思是 typedef std::vector<cont*> cont2; cont2* v=new cont2{};
现在我可以像往常一样访问元素了吗?正确的语法是什么?
Now assuming that stack memory is 1 megabyte and inserting 131072 pointers into this vector could fill it up since the vector itself is allocated in the stack.
这是错误的。矢量变量本身在堆栈上,但不在其元素上。 sizeof(vector)
大概是3个指针,不管它包含什么。后备数组总是在堆上。因此,请随意按值存储元素 - std::vector<cont>
。所有可调整大小的 STL 容器都使用堆。
总的来说,我不会太担心非嵌入式环境中的堆栈。使用 char buffer[256]
作为划痕 space 就可以了。另一方面,不要仅仅因为担心动态分配开销就把东西放在堆栈上。
我目前正在处理写入多个文件的总计 21 兆字节的纯文本数据。它由一些字符串和整数组成。正确地包含它们对我来说很重要,因为我能够以各种方式遍历它们,所以我为我的容器使用了相当复杂的 typedef
,例如
typedef std::tuple<std::string,
std::array<time_t, 12>,
std::array<std::map<std::vector<UINT>, bool>, 4>> cont;
我在最后一步将数据放入 std::vector<cont*> v
。我的用法在逻辑上可行吗?我曾经读到 OS 为每个可执行文件的堆栈内存保留 1 兆字节的内存。是真的吗?假设我的数据急剧增加。在我的系统中,诸如此类的指针无论指向什么,其大小都是 8 个字节。这是有道理的,因为它们只是某种指向内存中某处的整数,它们可以被认为是普通的 long long int
。现在假设堆栈内存为 1 兆字节,并且将 131072 个指针插入该向量可能会填满它,因为向量本身是在堆栈中分配的。那么对于这样一个抽象的场景,正确的做法是什么?在堆中也分配这个向量本身就足够了吗?我的意思是 typedef std::vector<cont*> cont2; cont2* v=new cont2{};
现在我可以像往常一样访问元素了吗?正确的语法是什么?
Now assuming that stack memory is 1 megabyte and inserting 131072 pointers into this vector could fill it up since the vector itself is allocated in the stack.
这是错误的。矢量变量本身在堆栈上,但不在其元素上。 sizeof(vector)
大概是3个指针,不管它包含什么。后备数组总是在堆上。因此,请随意按值存储元素 - std::vector<cont>
。所有可调整大小的 STL 容器都使用堆。
总的来说,我不会太担心非嵌入式环境中的堆栈。使用 char buffer[256]
作为划痕 space 就可以了。另一方面,不要仅仅因为担心动态分配开销就把东西放在堆栈上。