提问人:anothergreenhorse 提问时间:10/4/2023 最后编辑:anothergreenhorse 更新时间:10/4/2023 访问量:147
C/C++:为什么 iostream 在运行时分配的内存比 printf 多?
C/C++: Why does an iostream allocate more memory at runtime than printf?
问:
我今天注意到了这一点,觉得很有趣:
我首先用 C 语言编译了一个基本的“hello world”,然后用 C++ 编译了
#include <stdio.h>
int main() {
printf("a\n");
return 0;
}
#include <iostream>
int main() {
std::cout << "a" << std::endl;
return 0;
}
然后他们俩都跑过了瓦尔格林德。C版本(即使使用g++编译)显示分配了1,024个字节,而C++版本显示分配了73,728个字节
这似乎是一个相当大的差异--那里到底发生了什么?
再想一想,为什么运行 C 版本甚至需要整整一千字节?
感谢任何可以帮助我理解的人!
更新:
感谢大家的回复!
看起来 include 的一次性初始化成本略高于 72,000 字节,并且它本身仅使用与 相同的千字节。<iostream>
cout
printf
只是为了踢球,我写了以下内容并对其进行了测试:
#include <stdio.h>
class minified_output_stream {
void output(const char* text) {
printf(text);
}
public:
minified_output_stream& operator<<(const char* text) {
output(text);
return *this;
}
};
int main() {
minified_output_stream min_cout;
min_cout << "A\n";
return 0;
}
并发现,根据 valgrind 的说法,使用这种“模仿 cout”的二进制文件在运行时只分配了 1 KB 的内存。它可能不完全实用,但它绝对很有趣,并且有助于(或至少帮助我)更多地了解 C++ 与 C 中发生的事情
答:
我在我的 x86-64 Linux 上得到了相同的结果。在循环中运行它不会显示重复的分配,这意味着它是一次性初始化的事情。
运行零次表明,使用 g++,更大的 alloc(72,704 字节)只是因为使用 gcc 而不是 gcc 进行编译而发生的,因此它是 c++ 标准库初始化的一部分。
剩余的 1024 个一次性分配与 相同。可能与 stdio 相关的一些全局状态初始化。仔细检查后,它是 stdout 输出缓冲区的分配。它是 1024,因为输出文件被检测为终端,默认情况下仅执行行缓冲。重定向到非终端,例如 /dev/null,会导致分配转到 4096 进行完全缓冲。g++
printf
评论
valgrind a.out >/dev/null
评论
malloc(1)
<<