c++ 这两段代码的内存使用量怎么可能相同呢?

up9lanfz  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(151)

第一种情况:

#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*)

jjjwad0x

jjjwad0x1#

一个指针占用(通常)8个字节。
在这两种情况下,你都创建了一个有100万个相同指针的向量,所以向量数据有800万字节,总内存使用量取决于更多的因素,比如向量中有多少空闲空间,以及进程的其余部分使用了多少内存。
这两个程序都只包含字符串的一个副本,多出来的44个字节只是九牛一毛,第二个程序甚至可能不使用多出来的44个字节,如果它们是未使用的填充字节的话--这是很有可能的,因为操作系统只能以4096字节的块(称为页面)来分配内存。

相关问题