第一种情况:
#include <vector>
int main() {
const int iterations = 1'000'000;
std::vector<const char *> c;
for (int i = 0; i < iterations; i++) {
c.push_back("qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiop");
}
}
第二种情况:
#include <vector>
int main() {
const int iterations = 1'000'000;
std::vector<const char *> c;
for (int i = 0; i < iterations; i++) {
c.push_back("qwerty");
}
}
在这两种情况下,显示的活动进程的内存使用量约为11 MB。
第一个想法是内存使用量只指指针的大小,但是我怎么才能从外部知道某个软件使用了多少内存呢?(没有从代码内部明确计算大小)
编辑:我以为每次使用c.push_back("qwerty")
都会创建一个新的字符串。这就是我的目标。现在我通过如下方式修改代码来做到这一点:
#include <vector>
int main() {
const int iterations = 1'000'000;
std::vector<const char *> c;
for (int i = 0; i < iterations; i++) {
std::string* s = new std::string("sadadasd");
c.push_back((*s).c_str());
}
}
这看起来很糟糕,但至少现在内存使用是有意义的。有没有更优雅的方法来实现这一点?(我的意思是不引入std::string,只使用const char*)
1条答案
按热度按时间jjjwad0x1#
一个指针占用(通常)8个字节。
在这两种情况下,你都创建了一个有100万个相同指针的向量,所以向量数据有800万字节,总内存使用量取决于更多的因素,比如向量中有多少空闲空间,以及进程的其余部分使用了多少内存。
这两个程序都只包含字符串的一个副本,多出来的44个字节只是九牛一毛,第二个程序甚至可能不使用多出来的44个字节,如果它们是未使用的填充字节的话--这是很有可能的,因为操作系统只能以4096字节的块(称为页面)来分配内存。