微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于指针和动态内存的一般问题

如何解决关于指针和动态内存的一般问题

我目前正在处理写入多个文件的总共 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。我的用法在逻辑上可行吗?我曾经读过操作系统为每个可执行文件的堆栈内存保留了 1 兆字节的内存。这是真的吗?假设我的数据急剧增加。无论它们指向什么,在我的系统中诸如此类的指针的大小都是 8 个字节。这是有道理的,因为它们只是某种指向内存中某处的整数,它们可以被视为普通的 long long int。现在假设堆栈内存为 1 兆字节,并且将 131072 个指针插入此向量可以填满它,因为向量本身是在堆栈中分配的。那么对于这种抽象场景的正确方法是什么?在堆中也分配这个向量本身就足够了吗?我的意思是像 typedef std::vector<cont*> cont2; cont2* v=new cont2{}; 现在我可以像往常一样访问这些元素了吗?正确的语法如何?

解决方法

现在假设堆栈内存为 1 兆字节,并且将 131072 个指针插入该向量可以填满它,因为该向量本身是在堆栈中分配的。

那是假的。向量变量本身在堆栈上,但不在其元素上。 sizeof(vector) 大约是 3 个指针,无论它包含什么。后备数组总是在堆上。所以可以随意按值存储元素 - std::vector<cont>。所有可调整大小的 STL 容器都使用堆。

总的来说,我不会太担心非嵌入式环境中的堆栈。使用 char buffer[256] 作为临时空间很好。另一方面,不要仅仅因为担心动态分配开销而将东西放入堆栈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。