В C Сколько памяти тратит моя программа? - PullRequest
0 голосов
/ 25 мая 2011

Я хочу знать, например, у меня есть структура с тремя членами ... как:

struct Somethings { 
     int member1;
     int member2;
     char *member3;
} 

И я делаю это:


struct Something thing = {1, 2, "I'm a sentence..."};
 

Когда я запускаю свойпрограмма, что у меня будет в памяти?Я имею в виду, у меня будет только структура, помеченная как «вещь» со значениями тезисов, или у меня будет эта структура и другая копия значений тезисов в самом коде?Я думаю, что компилятор достаточно умен, чтобы иметь только одну копию этих значений в структуре, верно?Кто-то знает какую-либо команду, чтобы увидеть это?Я не очень хорошо знаю отладку ...

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

На практике ответ на ваш вопрос зависит от того, где именно вы объявляете эту строку:

struct Something thing = {1, 2, "I'm a sentence..."};

В области действия файла это объявляет thing с статической продолжительностью хранения , чтоозначает, что он живет от запуска программы до завершения программы.В этом случае, вполне вероятно, будет только одна физическая копия данных как в скомпилированной программе на диске, так и в памяти во время выполнения программы.

В качестве альтернативы, внутри функции это объявляет thingс автоматическая продолжительность хранения , что означает, что он живет только до возврата функции.В этом случае в скомпилированной программе все еще может быть только одна физическая копия данных, но во время выполнения программы будет создаваться вторая временная копия, создаваемая каждый раз при достижении объявления thing и уничтоженная.каждый раз, когда эта функция возвращается.(Обратите внимание, что это относится к 1, 2 и значению указателя, хранящемуся в thing.member3, но не к самой строке "I'm a sentence..." - эта копия все еще существует только одна).Если функция вызывается рекурсивно, то будут сделаны третьи, четвертые и т. Д. Временные копии данных.

0 голосов
/ 25 мая 2011

Определение struct Somethings - это то, как вы сообщаете компилятору о новом типе, который вы создали.struct Something thing - это способ создания объекта этого типа.

Когда программа запускается, все объекты создаются и после выхода из области видимости все они уничтожаются.Для объектов, которые вы создаете с помощью динамического выделения, вам или программе, которая завершает работу, нужно уничтожить объекты и освободить память, которую они содержат.

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

И определение структуры, которое вы дали в вопросе, не завершено должным образом.

0 голосов
/ 25 мая 2011

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

Location    Contents
   N          0x00    // highest byte of 1
   N+1        0x00   
   N+2        0x00
   N+3        0x01    // lowest byte of 1
   N+4        0x00    // highest byte of 2
   N+5        0x00
   N+6        0x00
   N+7        0x02    // loweest byte of 2
   N+8        0xLL    // Highest byte of pointer to pointing to location 0xLLMMNNPP
   N+9        0xMM    
   N+10       0xNN    
   N+11       0xPP    // Lowest byte of pointer pointing to 0xLLMMNNPP

И тогда в местоположении 0xLLMMNNPP у вас будут строковые данные:

   Location     Contents
   0xLLMMNNPP    0x49  // I
   0xLLMMNNPP+1  0x27  // '
   0xLLMMNNPP+2  0x6D  // m
   [and so on]
   0xLLMMNNPP+15 0x00  // the end-of-string terminator

В вашей программе структура на самом деле вообще не существует. Структура определяет только то, как данные должны быть размещены в памяти. Компилятор запомнит это определение и узнает, где найти фрагменты структуры, учитывая начальное местоположение, где данные структуры находятся в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...