Объем памяти C / C ++ для каждого исходного файла - PullRequest
0 голосов
/ 28 июля 2010

В программировании на C, есть ли способ определить, сколько одного файла исходного кода вносит в конечный объем памяти?

Давайте предположим простую C-программу, состоящую из исходных файлов test1.c , test2.c , test3.c и так далее.Средой является Linux, и компилятор gcc .

с objdump и readelf можно увидеть, увидев общий объем и то, как двоичный файл распределен в .text, .dataи .bss сегменты.Но можно ли увидеть, сколько двоичного кода генерируется за test1.c , сколько за test2.c и т. Д .?

Ответы [ 4 ]

4 голосов
/ 28 июля 2010

Название вопроса и его содержание, похоже, указывают в разных направлениях.

Если ваш вопрос состоит в том, сколько памяти потребуется вашему приложению во время выполнения для файла с исходным кодом, это неразрешимо в общем.Это может зависеть от внешних выходов, которыми вы не можете управлять, если, работая только с константами, вы не можете знать, насколько глубокой может быть рекурсия (требуется стек), или сколько вам потребуется динамической памяти, поскольку они, несомненно, будут зависеть от информации времени выполнения --inputs.1003 *

Если ваш вопрос состоит в том, сколько кода из конечного двоичного файла поступает из каждого из файлов, вы можете увидеть, достаточно ли у вас интереса.Нулевое приближение проверяет размер файлов .o, которые генерирует компилятор.Это приближение довольно плохое, поскольку компоновщик может удалять неиспользуемые символы из объектных файлов на этапе компоновки.Затем вы можете стать более любопытным и проверить символы в конечном исполняемом файле и найти эти символы в каждом из объектных файлов.Это даст гораздо лучшую информацию, но потребует гораздо больше работы.

4 голосов
/ 28 июля 2010

Нет, нет.Большая часть памяти выделяется во время выполнения и не может быть выведена из изучения исходных файлов.Например, учитывая этот код:

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

, нет никакого способа, которым изучение источника может сказать вам, сколько памяти будет выделено при выполнении программы.

1 голос
/ 28 июля 2010

Нет, принципиально нет.

Например, возьмите два исходных файла, каждый из которых содержит строку "Hello, world\n". Большинство компоновщиков могут сложить эти строковые литералы. Остается только один строковый литерал, как это следует учитывать? Подобная вещь происходит даже для функций. Например, std::vector<int>::push_back(int) и std::vector<long>::push_back(long) могут генерировать один и тот же исполняемый код, а компоновщики могут оставить только один экземпляр.

Кроме того, рассмотрим vector<int>::push_back(int) еще раз. На самом деле это происходит из заголовка <vector>, который будет включен во многие файлы .cpp. Но компилятор обычно вообще этого не записывает - test1.o также содержит все, что включено в test1.cpp.

1 голос
/ 28 июля 2010

Это очень странный вопрос.Принимая это по номиналу, вам просто нужно посмотреть на файлы .obj / .o, которые генерируются при компиляции.Это будет размер каждого модуля в терминах кода.

Однако это не учитывает память, выделяемую при запуске программы.Также не учитывается, что те части программы, которые в данный момент не запущены, не обязательно хранятся в памяти.

Если вы беспокоитесь о написании большого количества кода, который занимает всю вашу памятьне беспокойся об этом.Этого не может быть:)

...