2014-02-05 2 views
3
struct books 
{ 
    char name[100]; 
    float price; 
    int pages; 
}; 

Объявление структуры, не создавая object из более structure, делает структуру занимает пространство в памяти для ее DATA MEMBERS?действительно ли декларация структуры занимает память?

+0

Нет (просто подумайте, что это значит), но я не уверен, что это действительно так. –

+0

В какой памяти? Извините за педантичность, но ваша скомпилированная программа занимает некоторую память, а исходный код также занимает память – AlexT

+0

@AlexT: Я хочу сказать, что, когда я объявляю «структуру», не создавая никакого объекта «ОБЪЕКТ», он резервирует пространство для своего ' члены данных?? –

ответ

5

Определение структуры, как правило, не является частью двоичного файла в C. Оно существует только в вашем исходном коде.

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

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

Поэтому, если вы вообще не ссылаетесь на свою структуру, то никаких следов ее не должно присутствовать.

2

Является ли объявление структуры занимающим память?

Нет - вы не будете использовать память, пока не объявите переменную в стеке, куче или общей памяти. Вы просто определяете новый тип данных, который состоит из более чем одного другого типа данных.

Это будет потреблять память:

const struct books myBooks = { ...initialization code... }; \\ Consuming CODE memory (typically ROM)

struct books myBooks = { ...initialization code... }; \\ Consuming DATA memory (typically RAM)

1

No. в составленных объявлениях типа программы существует/определение, только в качестве концепций времени компиляции. Они не оставляют следов в скомпилированном коде и не влияют на потребление памяти во время выполнения. Хранение в программе C занято объектами. Типы не являются объектами.

+0

«Объект» - это концепция OO. Вы обычно ссылаетесь на C 'structs' как' objects'? – bblincoe

+1

@bblincoe: В терминологии языка C * объект * не является концепцией OO. Объект - это lvalue, область хранения. Каждое значение l в C является объектом, независимо от того, является ли это экземпляром структуры или нет. Когда вы объявили 'int i;' в C, 'i' является * объектом *. (Более того, идея C++ «объекта» точно такая же.) Ничто из этого не имеет ничего общего с OO. – AnT

+0

Благодарим вас за разъяснение. – bblincoe

Смежные вопросы