包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
Do a file containing words separated by newline and a vector of strings for those words in C++ have same size?
该文件的形式如下:
字1
字2 字3
...
我在从文件中读取这些单词后创建了字符串向量,如下所示:
std::vector<string> words;
string w;
ifstream file("input");
while(getline(file,w))
words.push_back(w);
file.close();
矢量占用的物理内存大小是否与输入文件的大小相同?为什么?
向量占用的物理内存大小是否与输入文件的大小相同?
这取决于"向量占用的物理内存大小">是什么意思。矢量对象本身的大小通常为 3 个指针(或 1 个指针和 2 个数字(,例如 64 位体系结构上的 24 个字节。但是,矢量随后会为至少N 个字符串对象动态分配空间,其中N是文件行数。请注意,如果不保留向量空间,则可能会分配比N个字符串更多的空间。
每个字符串对象都有一些"内部"大小(在我的实验中,libc++/Clang 为 24 字节,libstdc++/GCC 为 32 字节(。
然后,每个字符串都需要存储文本行。它可能会动态分配内存,或者对于短字符串,它可能采用小字符串优化。对于动态内存分配,您需要考虑一些填充,因为动态分配的缓冲区是对齐的(在我的环境中为 16 字节(。
因此,您无法在此处轻松比较内存占用。但是,一般来说,字符串向量会有很多开销。
如果要避免这种开销,只需将整个文件内容读取到单个字符数组(矢量、字符串(中,然后创建一个附加数组,其中包含指向各个行开始位置的指针。
向量实现有两个内存占用空间:sizeof(vector)
是堆栈上使用的内存(通常为 24 字节(,然后是动态分配的内存,首先是vector
,其次是string
参数。
向量分配的内存可能比容纳所有字符串的实际需要的内存多:如果按push_back
(或emplace_back
(增长它,每当容量不足时,它就会将动态分配的内存加倍。
最后,字符串有自己的开销:对于短单词(短于sizeof(string)
(,字符串中未使用的内存被浪费,而对于长单词,字符串必须分配动态内存并保留单独的指针(导致内存开销(。
因此,答案是:NOvector<string>
占用更多空间(可以分布在堆栈和堆上的不同位置之间(。
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 创建单词对齐的字符向量
- 如何用单词排列向量中的每个字符升序?
- 如何使用向量 c++ 迭代文件中单词的位置
- 将字符串拆分为单个单词并将它们放置在向量中
- 如何从C 向量访问单个单词
- 菜鸟问题:试图审查向量中的特定单词
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 如何在带有给定特定前缀的向量中打印出单词
- C - 将文本文件读为一串单词,然后将字符串分为向量
- 分类包含数字和单词的字符串向量
- 在 C++11 中计算字母和单词的双字母组合的 std::线程向量的问题
- 在向量中通过一个单词查找行
- 使用单词键将多个行号的向量添加到我的地图中
- 计算字符向量中单词的出现次数
- 在向量中搜索C++字符串s中的单词
- 向量中的常用单词用C++表示单词出现的次数
- 计算向量中偶数长度的单词
- 单词比较 - 向量/getopt
- 将字符串拆分为单词向量