Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;内存占用,每个源文件_C++_C_Gcc_Objdump - Fatal编程技术网

C++ C/C++;内存占用,每个源文件

C++ C/C++;内存占用,每个源文件,c++,c,gcc,objdump,C++,C,Gcc,Objdump,在C编程中,有没有办法确定单个源代码文件对最终内存占用的贡献 让我们假设一个简单的C程序由源文件test1.C、test2.C、test3.C等组成。环境是Linux和编译器gcc 使用objdump和readelf可以查看总占用空间以及二进制文件在.text、.data和.bss段中的分布情况。但是有可能看到每个test1.c生成多少二进制代码,每个test2.c生成多少二进制代码,等等吗?没有。大多数内存是在运行时分配的,不能从检查源文件中推断出来。例如,给定以下代码: int n; cin

在C编程中,有没有办法确定单个源代码文件对最终内存占用的贡献

让我们假设一个简单的C程序由源文件test1.C、test2.C、test3.C等组成。环境是Linux和编译器gcc


使用
objdump
readelf
可以查看总占用空间以及二进制文件在
.text
.data
.bss
段中的分布情况。但是有可能看到每个test1.c生成多少二进制代码,每个test2.c生成多少二进制代码,等等吗?

没有。大多数内存是在运行时分配的,不能从检查源文件中推断出来。例如,给定以下代码:

int n;
cin >> n;
char * p = new char[n];

检查源代码无法告诉您在执行程序时将分配多少内存。

这是一个非常奇怪的问题。从表面上看,您只需要查看编译时生成的.obj/.o文件。这些将是每个模块的大小,以代码为单位

但是,这并不考虑程序运行时分配的任何内存。它也没有考虑到程序中当前未运行的部分不一定保存在内存中


如果你担心写大量的代码会占用你所有的内存,不要担心。这不可能发生。:)

问题的标题和内容似乎指向不同的方向

如果您的问题是,您的应用程序在运行时每个源代码文件需要多少内存,那么这在一般情况下是无法确定的。它可能依赖于您无法控制的外部输出,除非仅使用常量,您无法知道递归的深度(需要堆栈)或需要多少动态内存,因为这些肯定取决于运行时信息——输入

如果您的问题是最终二进制文件中有多少代码来自每个文件,那么您可以看到您是否有足够的兴趣。零eth近似值检查编译器生成的
.o
文件的大小。这种近似是相当糟糕的,因为链接器可以在链接阶段从对象文件中删除未使用的符号。然后,您可以使用fancier检查最终可执行文件中的符号,并在每个对象文件中查找这些符号。这将提供更好的信息,但需要做更多的工作。

不,基本上不是

例如,取两个源文件,它们都包含字符串
“Hello,world\n”
。大多数链接器都能够折叠这些字符串文本。只剩下一个字符串文字,如何解释?即使对于函数,也会发生类似的情况。例如,
std::vector::push_back(int)
std::vector::push_back(long)
可能会生成相同的可执行代码,链接器可能只留下一个实例


此外,请考虑<代码> vector::推回(int)< /代码>。它实际上来自一个标题,

,它将包含在许多.cpp文件中。但是编译器通常根本不记录它-
test1.o
也包含test1.cpp包含的所有内容。

是的:只需编译它并亲自查看。您的第二段完全回答了我想问的问题。非常感谢您的回答:)实际上,valgrind使查找堆内存的分配位置变得非常容易:。但我甚至不能肯定这就是问题所要问的。