C/C++:为什么 iostream 在运行时分配的内存比 printf 更多?

问题描述 投票:0回答:2

我今天注意到了这一点,觉得很有趣:

我先用 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;
}

并通过 valgrind 运行它们。 C 版本(即使使用 g++ 编译)显示 1,024 字节分配,而 C++ 版本显示73,728 字节分配

这似乎是一个相当大的差异——到底发生了什么?

再想一想,为什么运行 C 版本甚至需要整整 KB?

感谢任何可以帮助我理解的人!

c++ c memory allocation
2个回答
0
投票

我在 x86-64 Linux 上得到了相同的结果。在循环中运行它不会显示重复的分配,这意味着它是一次性初始化的事情。 运行零次表明,使用 g++ 时,会发生更大的分配(72,704 字节),这仅仅是因为使用

g++
进行编译而不是 gcc,因此它是 c++ 标准库初始化的一部分。 剩余的 1024 个一次性分配与
printf
相同。可能有一些与 stdio 相关的全局状态初始化。仔细观察,这是stdout的输出缓冲区的分配。它是 1024,因为输出文件被检测为终端,默认情况下仅进行行缓冲。重定向到非终端,例如 /dev/null,会导致分配转到 4096 以实现完整缓冲。


-2
投票

当您使用 C 中的

printf
函数时,它非常灵活,因为它接受任意数量的参数。但这种灵活性是有代价的。为了使用它们,
printf
必须在运行时分析格式字符串。这需要一些内存分配。

您可能认为只分配 1,024 字节来打印“Hello World”是多余的——您是对的。这是一个相对较小的量,但无论你的程序多么简单,这种情况都会发生。

C++ 通过使用

iostream
库解决了这个问题,当涉及到强大且灵活的输入/输出选项时,该库为
printf
提供了引导。它通过运算符重载和类型安全等奇特功能来实现这一点。这样做的问题是 C++ 运行时需要设置和初始化动态内存分配以及其他机制来处理对象。

因此您会看到 C++ 版本的内存分配从 1,024 字节增加到 73,728 字节。不过,不用担心试图找出原因。 C++ 的幕后工作原理,我保证我不是故意让你困惑的😂

© www.soinside.com 2019 - 2024. All rights reserved.