Войти
ФлеймФорумПрограммирование

Вопросы по C++ (4 стр)

Страницы: 13 4 5 69 Следующая »
#45
23:43, 17 дек. 2009

О. Федор
омг.
На сколько я знаю в Assemblere есть регистры адреса и смещения.
И нет всяких структур и классов о.О

То есть по укакателю можно прочитать только 4 байта за раз(или 8 в современных компутерах).
Есть еще смещения, что-то типа операции [] в С

Так где-же информация о типе? о.О
Тоесть компилятор преобразует тип указателя в код и все. Ни где его дальше не хранит.


#46
23:46, 17 дек. 2009

О. Федор
> Ты можешь на асме обойти стандарт языка? Ну и что? Какое это имеет отношение к
> языку?
> Изнасиловать память можно не только с помощью асмы; существуют и другие, более
> цивильные способы.
> Но какое это все имеет отношению к тезису, что указатель имеет статическую
> информацию о типе?
май год, язык то в чём заключается? В компиляторе. Это при компиляции он знает тип, это при компиляции он не даёт подавать указатели тех типов, каких не положено, это после компиляции, как правило остаётся байт-код, который и знать не знает ни о каких типах, только как и по каким адресам двигать биты, байты и байтищи.

#47
23:49, 17 дек. 2009

О. Федор
прав. указатель, как инструмент языка, а не как 32х-битное значение, знает о том, на какой тип указывает.

#48
23:54, 17 дек. 2009

Pokimon
> Так где-же информация о типе? о.О

Это статическая информация.

> Тоесть компилятор преобразует тип указателя в код и все. Ни где его дальше не
> хранит.

Что значит не хранит? Эта информация - в коде.

Necrys
> май год, язык то в чём заключается? В компиляторе. Это при компиляции он знает
> тип, это при компиляции он не даёт подавать указатели тех типов, каких не
> положено, это после компиляции,

Ну так что?
Ты же знаешь, что статическая информация как раз тем и отличается, что используется во время компиляции, о чем здесь спорить?

> как правило остаётся байт-код, который и знать
> не знает ни о каких типах, только как и по каким адресам двигать биты, байты и
> байтищи.

Повторяю. Эта информация - в коде. Она никуда не изчезает, она просто иначе используется.

#49
23:56, 17 дек. 2009

Pokimon
Necrys

int     a;
float   b;

По-вашему у a и b нету типа? Где информация о типе? Только байты...

#50
23:57, 17 дек. 2009

О. Федор
> Отсюда ясно видно, что ячейки k1 даже не существует; у нее нет адреса.
Мне таки кажется, что в асм будет существовать ячейка под переменную к1.

А насчёт остального: тип указателя - это абстракция языка. Это как математика. Только потому, что математически группы Ли описывают свойства реального мира, вовсе не означает, что эти группы в том или ином виде существуют в физическом мире.

#51
0:08, 18 дек. 2009

Nomad
> Мне таки кажется, что в асм будет существовать ячейка под переменную к1.

Не так давно я тоже так думал, а потом мне посоветовали посмотреть на асму и действительно: такой ячейки нет.

> А насчёт остального: тип указателя - это абстракция языка. Это как математика. Только потому, что
> математически группы Ли описывают свойства реального мира, вовсе не означает, что эти группы в том > или ином виде существуют в физическом мире.

О статической информации в C++ этого не скажешь; она вполне реальна, хотя после компиляции превращается в код (здесь имеется в виду в частности то, что k1 после компиляции не содержится в какой-то ячейке, а действует как часть кода).

#52
10:11, 18 дек. 2009

О. Федор
> const static int k = 11;
будет скорее всего вставляться напрямую числом 11.
Что так взъерошился? Парню надо знать, что его переменная-указатель занимает 4 байта (для 32 битных программ), эти 4 байта -- адрес в памяти. Зная это, становится ясной арифметика указателей. Представляя же, что в этой переменной (а звучало так) хранится тип данных, это становится совсем не ясно. Во время компиляции хранится информация о типе, которая нужна, чтобы не делать глупых ошибок, и интуитивно понятна.

> const static int k1 = 11;
> int &r1 = k1; //error C2440:
> Отсюда ясно видно, что ячейки k1 даже не существует; у нее нет адреса.
Решение:
const int &r1 = k1;

#53
16:45, 18 дек. 2009

Voltt
> будет скорее всего вставляться напрямую числом 11.

Правильно

> Парню надо знать, что его переменная-указатель занимает 4
> байта (для 32 битных программ), эти 4 байта -- адрес в памяти. Зная это,
> становится ясной арифметика указателей.

Думаю, что парень уже знает, что сам указатель имеет одинаковую длину, вне зависимости от типа, естественно.

> Представляя же, что в этой переменной
> (а звучало так) хранится тип данных, это становится совсем не ясно.

Этого я нигде не утверждал.

> Во время компиляции хранится информация о типе, которая нужна, чтобы не делать глупых
> ошибок, и интуитивно понятна.

Вот и прекрасно, что и требовалось доказать.

#54
21:25, 18 дек. 2009

О. Федор
феерично!
> const int &r1 = k1;
это прокомментируй :)

#55
22:32, 18 дек. 2009

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.

Прошло более 7 лет
#56
18:26, 25 фев. 2017

эсть вопрос:
это нормально, когда структуры наследуются от классов? :)

#57
18:45, 25 фев. 2017

Наследование - это в принципе не нормально. Если тебе понадобилось наследование, скорее всего ты что-то делаешь не так.

#58
18:51, 25 фев. 2017

Классы - это в принципе не нормально. Если тебе понадобились классы, скорее всего ты что-то делаешь не так.

#59
19:08, 25 фев. 2017

C++ - это в принципе не нормально. Если тебе понадобился C++, скорее всего ты что-то делаешь не так.

Страницы: 13 4 5 69 Следующая »
ФлеймФорумПрограммирование