Автор Тема: C++ инициализация ссылок  (Прочитано 57985 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #90 : Март 21, 2013, 09:30:14 pm »
Цитировать
Не понял, а для кого я printf вызывал? Это как раз и есть та самая фукнция из внешней среды. Могу еще раз вызвать - результат не изменится :-) C WinAPI (если бы он существовал на линуксе) было бы то же самое.
Так добавьте ещё один вызов того же printf, но уже с ref * 2. Второй вызов и последующее использование ref не дадут его соптимизировать.
Эмм.. С чего бы?

define i32 @_Z3twov() {
  %1 = tail call i32 @random()                    ; <i32> [#uses=1]
  %2 = srem i32 %1, 42                            ; <i32> [#uses=1]
  ret i32 %2
}

declare i32 @random()

define i32 @main() {
  %1 = tail call i32 @random()                    ; <i32> [#uses=1]
  %2 = srem i32 %1, 42                            ; <i32> [#uses=2]
  %3 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %2) ; <i32> [#uses=0]
  %4 = shl i32 %2, 1                              ; <i32> [#uses=1]
  %5 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %4) ; <i32> [#uses=0]
  ret i32 0
}
Ровно то же самое. Никаких указателей.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #91 : Март 21, 2013, 09:32:39 pm »
Так я и пришёл к выводу, что null в качестве реального объекта безопаснее.

NULL не может быть объектом по определению. NULL - это нулевой указатель и ничего более. Такой указатель не может указывать на объект (явно огворено в стандарте). Даже в экзотических архитектурах, где объекты могут быть размещены по нулевому (0x0000 в терминах железки) адресу, указатель на такой объект (this) не будет равен NULL (потому что NULL будет представлен там каким-то другим значением).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #92 : Март 21, 2013, 09:35:55 pm »
Тогда это все будет выглядеть как prev(lexems) и current(lexems), swap(lexems).

Угу. Так тоже можно. Смысл все тот же - не вываливать потроха на пользователя класса и иметь полный контроль над этими потрохами.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #93 : Март 21, 2013, 09:54:44 pm »
Алексей, расходы на локальную память растут: %1-%4. В локальной памяти хранятся результаты вызовов функций, а указатели не нужны, потому что указатели и есть адреса ячеек %1-%4.

*(&%1) превращается просто в упоминание %1.

Кстати, а как дела с указателями?
int i;

int main ()
{
  int* p = &i;
  (*p) = 42;
  printf("%d", *p);
  return 0;
}

Хороший компилятор соптимизирует до printf("%d", i), что не повысит статус указателя до магического, а просто в очередной раз подтвердит высокий уровень оптимизации.

Цитировать
NULL не может быть объектом по определению. NULL - это нулевой указатель и ничего более. Такой указатель не может указывать на объект (явно огворено в стандарте). Даже в экзотических архитектурах, где объекты могут быть размещены по нулевому (0x0000 в терминах железки) адресу, указатель на такой объект (this) не будет равен NULL (потому что NULL будет представлен там каким-то другим значением).
Имеется в виду распространённая практика null с малой буквы, то есть реальный объект, играющий роль пустышки.

TObject null_obj;
TObject* null = &null_obj;

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #94 : Март 21, 2013, 09:57:19 pm »
Я бы всё же поднял время редактирования сообщений до минут 5.

Хороший компилятор соптимизирует до printf("%d", i=42).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #95 : Март 21, 2013, 10:00:22 pm »
TObject null_obj;
TObject* null = &null_obj;

Такое решение возможно, но тут правильнее называть такой объект не "null", а "default". И если под практикой имеется ввиду инициализация всех указателей всегда таким умолчательным значением (вместо NULL) - то я против такой практики (похоже на попытку решения проблемы не самыми эффективными средствами).

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #96 : Март 21, 2013, 10:08:16 pm »
null — это тип данных и одновременное значение в JavaScript и, в частности, JSON формате (собственно, Вы это и без меня знаете :) ). Поэтому имя default как-то не отвечает смыслу. В С++ ведь заняты только NULL и nullptr (макрос и стандартизированное значение).

Нет, поголовно указатели не инициализируются им.
« Последнее редактирование: Март 21, 2013, 10:10:44 pm от Berserker »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #97 : Март 21, 2013, 10:19:33 pm »
Алексей, расходы на локальную память растут: %1-%4. В локальной памяти хранятся результаты вызовов функций, а указатели не нужны, потому что указатели и есть адреса ячеек %1-%4.
Не растут. В IL LLVM просто нет изменяемых "регистров". Каждое новое сложение/умножение/вычитание всегда порождает очередной %n.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #98 : Март 22, 2013, 04:49:56 am »
Мда ,.. господа...вам не кажется что закладываться на гипотетическую (или конкретную) реализацию  яп... трактуя особенности семантики .. все равно , что закладываться на UB (аргументация уровня ... а если бы у бабушки были яйца .., или мой дедушка делает так.., или - пожилые люди обычно делают так)..  как -то несерьезно ..

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #99 : Март 22, 2013, 08:46:13 am »
Ну и FFFFFUUUUUUUUUU этот ваш С++ о_О
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #100 : Март 22, 2013, 12:00:41 pm »
Ну и FFFFFUUUUUUUUUU этот ваш С++ о_О
В плане завязки на оптимизации хаскель еще хуже :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #101 : Март 22, 2013, 12:03:03 pm »
Мда ,.. господа...вам не кажется что закладываться на гипотетическую (или конкретную) реализацию  яп... трактуя особенности семантики .. все равно , что закладываться на UB (аргументация уровня ... а если бы у бабушки были яйца .., или мой дедушка делает так.., или - пожилые люди обычно делают так)..  как -то несерьезно ..
Дык я лично например не закладываюсь. Я вообще всеми силами противился опускания дискуссии до уровня битиков и байтиков конкретной реализации под конкретную платформу. Ибо в байтиках семантику языка не увидеть, максимум что будет видно - одна из проекций оной семантики на конкретную реализацию.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #102 : Март 23, 2013, 07:41:06 am »
Ну и FFFFFUUUUUUUUUU этот ваш С++ о_О
   :D Geniepro ---  вы прям как животное (делаете то что нравится, работаете на том что нравится...)

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #103 : Март 23, 2013, 07:42:53 am »

Дык я лично например не закладываюсь. Я вообще всеми силами противился опускания дискуссии до уровня битиков и байтиков конкретной реализации под конкретную платформу. Ибо в байтиках семантику языка не увидеть, максимум что будет видно - одна из проекций оной семантики на конкретную реализацию.
Я заметил... что практически ЛЮБОЙ разговор на ЛЮБОМ форуме о С++ сводится к этому..  с чего бы это?  :D

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #104 : Март 23, 2013, 07:50:22 am »
Потому что без более-менее точного представления о физической реализации невозможно писать хороший код с точки зрения эффективности. А в С++ в ряде мест используется магия слов и понятий, затуманивающих явления. Те же ссылки невозможно реализовать без указателей в общем случае. Более того, у них все свойства указателей де-факто сохраняются. При этом FAQ пишет такие вещи как «Reference IS Object», что просто улыбка с лица не сходит.