Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Аноним  
Дата: 14.09.04 12:57
Оценка:
Добрый день!
Я давно уже задаюсь абсолютно глупым вопросом: "Как работает "sizeof"?".
Суть моего вопроса в том, как же компилятор выполняет "sizeof". Я подозреваю что это козни препроцессора. На это указывают грабли про передачу ссылки на переменную и имени массива переменных в sizeof. Т.е. если ты объявил массив и передал его имя sizeof'у, то транслятор запросто может отследить какой размер я прописал и вместо "sizeof <имя массива>" поставить число. Если мы передаём указатель, то транслятор смотрит тип переменной, чьё имя передано и это указатель -- двойное слово (адрес); поэтому получаем размер переменной типа "<тип> *".
Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.

Надеюсь, не слишком тупой текст получился...
Спасибо!
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Кодт Россия  
Дата: 14.09.04 13:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я давно уже задаюсь абсолютно глупым вопросом: "Как работает "sizeof"?".


sizeof не "работает", это псевдо-функция времени компиляции.

А>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.


Такая таблица есть не в рантайме, а у компилятора. Разумеется, компилятор знает размер массива, имя которого упоминается. А если мы получили указатель на элементы массива — то уже извините, это совсем другой тип.
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Анатолий Широков СССР  
Дата: 14.09.04 13:06
Оценка:
sizeof — вычисляет размер необходимый для хранения типа передаваемого в качестве аргумента выражения. sizeof вычисляется компилятором во время компиляции единицы трансляции на основе словаря (по идентификатору определяется тип и вся сопутсвующая информации необходимая для вывода размера), поэтому ни о каком анализе "на что указывает указатель" не может быть и речи.
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: LaptevVV Россия  
Дата: 14.09.04 13:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день!

А>Я давно уже задаюсь абсолютно глупым вопросом: "Как работает "sizeof"?".
А>Суть моего вопроса в том, как же компилятор выполняет "sizeof". Я подозреваю что это козни препроцессора. На это указывают грабли про передачу ссылки на переменную и имени массива переменных в sizeof. Т.е. если ты объявил массив и передал его имя sizeof'у, то транслятор запросто может отследить какой размер я прописал и вместо "sizeof <имя массива>" поставить число. Если мы передаём указатель, то транслятор смотрит тип переменной, чьё имя передано и это указатель -- двойное слово (адрес); поэтому получаем размер переменной типа "<тип> *".
А>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.

Грубо говоря sizeof — это функция компилятора. Она не работает во время выполнения нашей программы. Это удобство в языке С (а не в препроцессоре) для программиста, чтоб он, бедный, не парился и не вычислял размеры сам. Компилятор во время работы обязательно вычисляет все размеры всех типов и переменных (а про встроенные он и так все знает), так как память ему распределять. И размер объявленного массива он, естественно, тоже вычисляет. Все это в таблице имен у него хранится.
А размер динамического массива, естественно, при компиляции неизвестен — sizeof-то на этапе компиляции работает, а не во время работы программы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: g_i  
Дата: 14.09.04 13:16
Оценка:
Здравствуйте, Аноним, Вы писали:

..
А>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.

А>Надеюсь, не слишком тупой текст получился...

А>Спасибо!

sizeof вычисляется на этапе компиляции.
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Жмур Россия  
Дата: 14.09.04 13:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я давно уже задаюсь абсолютно глупым вопросом: "Как работает "sizeof"?".

А>Суть моего вопроса в том, как же компилятор выполняет "sizeof". Я подозреваю что это козни препроцессора. почему нельзя определить размер массива, на который имеется указатель.

char *array_pointer(new char[20]);


Да. Как-то сумбурно. Но сам подумай, а как компилятор НА ЭТАПЕ КОМПИЛЯЦИИ узнает, что переданный array_pointer в будущем будет содержать динамическое значение new char[20]? Если ты подумал, что sizeof — это runtime оператор, то ошибся.
<< RSDN@Home 1.1.4 @@subversion >>
Re: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Кодт Россия  
Дата: 14.09.04 13:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.


Специально для любителей определять размер массива в рантайме — пожалуйста. std::vector
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[2]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: jazzer Россия Skype: enerjazzer
Дата: 14.09.04 13:48
Оценка: 1 (1) :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.


К>Специально для любителей определять размер массива в рантайме — пожалуйста. std::vector


Не. std::vector — это для любителей определять в рантайме размер стд::вектора
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: JakeS  
Дата: 14.09.04 18:19
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Кодт, Вы писали:


К>>Здравствуйте, Аноним, Вы писали:


А>>>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков, хотя, почему бы и нет... Но тогда почему нельзя определить размер массива, на который имеется указатель.


К>>Специально для любителей определять размер массива в рантайме — пожалуйста. std::vector


J>Не. std::vector — это для любителей определять в рантайме размер стд::вектора


угу. а для любителей определять в рантайме размер с++ массива в аптеке есть таблеточки для запоминания констант...
Re[2]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Adil Россия  
Дата: 15.09.04 12:03
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Такая таблица есть не в рантайме, а у компилятора. Разумеется, компилятор знает размер массива, имя которого упоминается.
Нет, это не так. Иначе как бы работал в рантайме оператор delete[]? Размер динам.массива, в прочем как и любого динамически занятого блока, храниться именно в рантайме, только реализация этого хранения специфична для каждого компилятора (и их версиям!) -например, почти все борланды на сегодя хранят это значение по адресу перед началом блока — поэтому пользоваться этим настоятельно не рекомедуется, хотя в принципе возможно.
Удачи.
Re[3]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Анатолий Широков СССР  
Дата: 15.09.04 12:18
Оценка:
Здравствуйте, Adil, Вы писали:

A>Здравствуйте, Кодт, Вы писали:

К>>Такая таблица есть не в рантайме, а у компилятора. Разумеется, компилятор знает размер массива, имя которого упоминается.
A>Нет, это не так. Иначе как бы работал в рантайме оператор delete[]? Размер динам.массива, в прочем как и любого динамически занятого блока, храниться именно в рантайме, только реализация этого хранения специфична для каждого компилятора (и их версиям!) -например, почти все борланды на сегодя хранят это значение по адресу перед началом блока — поэтому пользоваться этим настоятельно не рекомедуется, хотя в принципе возможно.

Причем здесь размер динамического массива, когда вопрос был: почему sizeof может вычислить размер статического массива, и не может определить размер динамического только лишь по указателю? Ответ: потому что sizeof вычисляется во время компиляции. А как компилятор вычисляет размер статического массива? Ответ: на основе таблицы символов, которую строит компилятор при синтаксическом анализе единицы трансляции. А почему не может вычислить размер по указателю? Ответ: по той же причине, потому что во время компиляции вычислить природу данных, на которые указывается указатель не представляется возможным.
Re[4]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Adil Россия  
Дата: 15.09.04 12:30
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Причем здесь размер динамического массива, когда вопрос был: почему sizeof может вычислить размер статического массива, и не может определить размер динамического только лишь по указателю?...

А>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков...

K>Такая таблица есть не в рантайме, а у компилятора...
Удачи.
Re[5]: Хочу зашить дырку в знаниях. Вопрос про суть sizeof.
От: Анатолий Широков СССР  
Дата: 15.09.04 12:38
Оценка:
Здравствуйте, Adil, Вы писали:

A>Здравствуйте, Анатолий Широков, Вы писали:

АШ>>Причем здесь размер динамического массива, когда вопрос был: почему sizeof может вычислить размер статического массива, и не может определить размер динамического только лишь по указателю?...

А>>Как-то тяжело укладывается что в ОЗУ где-то есть таблица адресов и размеров занятых блоков...

K>>Такая таблица есть не в рантайме, а у компилятора...

Это продолжение рассуждений автора, которые Вы так избирательно упразнили. Перед этим ведь было:

Суть моего вопроса в том, как же компилятор выполняет "sizeof"

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.