О. Федор
омг.
На сколько я знаю в Assemblere есть регистры адреса и смещения.
И нет всяких структур и классов о.О
То есть по укакателю можно прочитать только 4 байта за раз(или 8 в современных компутерах).
Есть еще смещения, что-то типа операции [] в С
Так где-же информация о типе? о.О
Тоесть компилятор преобразует тип указателя в код и все. Ни где его дальше не хранит.
О. Федор
> Ты можешь на асме обойти стандарт языка? Ну и что? Какое это имеет отношение к
> языку?
> Изнасиловать память можно не только с помощью асмы; существуют и другие, более
> цивильные способы.
> Но какое это все имеет отношению к тезису, что указатель имеет статическую
> информацию о типе?
май год, язык то в чём заключается? В компиляторе. Это при компиляции он знает тип, это при компиляции он не даёт подавать указатели тех типов, каких не положено, это после компиляции, как правило остаётся байт-код, который и знать не знает ни о каких типах, только как и по каким адресам двигать биты, байты и байтищи.
О. Федор
прав. указатель, как инструмент языка, а не как 32х-битное значение, знает о том, на какой тип указывает.
Pokimon
> Так где-же информация о типе? о.О
Это статическая информация.
> Тоесть компилятор преобразует тип указателя в код и все. Ни где его дальше не
> хранит.
Что значит не хранит? Эта информация - в коде.
Necrys
> май год, язык то в чём заключается? В компиляторе. Это при компиляции он знает
> тип, это при компиляции он не даёт подавать указатели тех типов, каких не
> положено, это после компиляции,
Ну так что?
Ты же знаешь, что статическая информация как раз тем и отличается, что используется во время компиляции, о чем здесь спорить?
> как правило остаётся байт-код, который и знать
> не знает ни о каких типах, только как и по каким адресам двигать биты, байты и
> байтищи.
Повторяю. Эта информация - в коде. Она никуда не изчезает, она просто иначе используется.
Pokimon
Necrys
int a; float b;
По-вашему у a и b нету типа? Где информация о типе? Только байты...
О. Федор
> Отсюда ясно видно, что ячейки k1 даже не существует; у нее нет адреса.
Мне таки кажется, что в асм будет существовать ячейка под переменную к1.
А насчёт остального: тип указателя - это абстракция языка. Это как математика. Только потому, что математически группы Ли описывают свойства реального мира, вовсе не означает, что эти группы в том или ином виде существуют в физическом мире.
Nomad
> Мне таки кажется, что в асм будет существовать ячейка под переменную к1.
Не так давно я тоже так думал, а потом мне посоветовали посмотреть на асму и действительно: такой ячейки нет.
> А насчёт остального: тип указателя - это абстракция языка. Это как математика. Только потому, что
> математически группы Ли описывают свойства реального мира, вовсе не означает, что эти группы в том > или ином виде существуют в физическом мире.
О статической информации в C++ этого не скажешь; она вполне реальна, хотя после компиляции превращается в код (здесь имеется в виду в частности то, что k1 после компиляции не содержится в какой-то ячейке, а действует как часть кода).
О. Федор
> const static int k = 11;
будет скорее всего вставляться напрямую числом 11.
Что так взъерошился? Парню надо знать, что его переменная-указатель занимает 4 байта (для 32 битных программ), эти 4 байта -- адрес в памяти. Зная это, становится ясной арифметика указателей. Представляя же, что в этой переменной (а звучало так) хранится тип данных, это становится совсем не ясно. Во время компиляции хранится информация о типе, которая нужна, чтобы не делать глупых ошибок, и интуитивно понятна.
> const static int k1 = 11;
> int &r1 = k1; //error C2440:
> Отсюда ясно видно, что ячейки k1 даже не существует; у нее нет адреса.
Решение:
const int &r1 = k1;
Voltt
> будет скорее всего вставляться напрямую числом 11.
Правильно
> Парню надо знать, что его переменная-указатель занимает 4
> байта (для 32 битных программ), эти 4 байта -- адрес в памяти. Зная это,
> становится ясной арифметика указателей.
Думаю, что парень уже знает, что сам указатель имеет одинаковую длину, вне зависимости от типа, естественно.
> Представляя же, что в этой переменной
> (а звучало так) хранится тип данных, это становится совсем не ясно.
Этого я нигде не утверждал.
> Во время компиляции хранится информация о типе, которая нужна, чтобы не делать глупых
> ошибок, и интуитивно понятна.
Вот и прекрасно, что и требовалось доказать.
О. Федор
феерично!
> const int &r1 = k1;
это прокомментируй :)
JokerR
> > const int &r1 = k1;
> это прокомментируй :)
Пожалуйста. Для полноты впечатлений я несколько модифицировал код (меня просто заинтересовало, что там происходит в разных случаях, включая и с параметрами шаблона)
struct BlaBla { const static int k1 = 11; static int k2; template<int kt> void f() { const int &r11 = k1; const int &r12 = 11; const int &r13 = kt; cout <<" &k1 " << &k1 <<" *(&k1) " << *( &k1) << " &r11 " << &r11 << endl; } }; BlaBla haha; haha.f<11>( );
это дает ассемблер код
const int &r11 = k1; 0041EF73 mov dword ptr [r11],offset BlaBla::k1 (45201Ch) const int &r12 = 11; 0041EF7A mov dword ptr [ebp-2Ch],0Bh 0041EF81 lea eax,[ebp-2Ch] 0041EF84 mov dword ptr [r12],eax const int &r13 = kt; 0041EF87 mov dword ptr [ebp-44h],0Bh 0041EF8E lea eax,[ebp-44h] 0041EF91 mov dword ptr [r13],eax
т.е. ссылка на параметр шаблона const int &r13 = kt; в принципе не отличается от ссылки на литерал (кажется я это правильно назвал) 11, а k1 все же имеет адрес 45201Ch.
эсть вопрос:
это нормально, когда структуры наследуются от классов? :)
Наследование - это в принципе не нормально. Если тебе понадобилось наследование, скорее всего ты что-то делаешь не так.
Классы - это в принципе не нормально. Если тебе понадобились классы, скорее всего ты что-то делаешь не так.
C++ - это в принципе не нормально. Если тебе понадобился C++, скорее всего ты что-то делаешь не так.
Тема в архиве.