LINUX.ORG.RU
Ответ на: комментарий от KblCb

чем отличается «передача объекта по ссылке» от «передачи ссылки на объект»

Очень любопытно. И в чём отличие?

ну две ситуации:

  • вы показываете паспорт таможеннику, и он вас пропускает за границу.
  • вы посылаете за границу паспорт по почте

разница становится более понятной?

Нет, не очевиден. Приведи алгоритм. Хотя бы один который будет работать и не затыкаться на циклических ссылках.

я-бы привёл. Но сначала обоснуйте физический смысл этих ваших циклических ссылок? Или я должен в угадайку с вами играть?

emulek
()
Ответ на: комментарий от emulek

Хм. В передаче объекта по ссылке ты фактически передаешь указатель на этот объект. В передаче ссылки на объект ты тоже передаешь указатель на объект.

В чем разница-то?

Anon
()
Ответ на: комментарий от Anon

Хм. В передаче объекта по ссылке ты фактически передаешь указатель на этот объект. В передаче ссылки на объект ты тоже передаешь указатель на объект. В чем разница-то?

для тебя поясню: разница в константности. Когда ты пишешь strcpy(dest, src); ты передаёшь обе строки «по ссылке» (т.е. передаёшь указатель). Однако, мусором становится только dest, но НЕ src. В C++ это выглядит так: dest = src;, при этом как и в сишечке, src никак не меняется, и потому не уходит в мусорку. А вот dest уходит. Мало того, src ещё и уходит в dest, что говорит о том, что если ты потом удолишь src, то он всё равно останется, т.к. его содержит новый dest.

Да, самый простой способ это учесть: считать ссылки. Это самый простой и самый примитивный способ. Кроме него очевиден другой путь: помнить внутри src(или внутри dest), что он уже указывает ещё и на dest(или что dest это ещё и src). Это уже допускает «циклические» ссылки, т.е. dest<->src.

Т.о. можно сделать так, что «циклические» ссылки на самом деле указывают на один и тот же объект, который сам по себе скрыт, но на него доступно любое количество ссылок. В самом простом случае, с этим скрытым объектом можно связать и счётчик. И не один даже(можно сделать отдельный константный, и отдельный неконстантный). А можно и не делать, ибо если объект помнит, КУДА он указывает, сто зачем этот счётчик вообще нужен, если и так нужен например список? Если список пуст, то объект можно удалить.

emulek
()
Ответ на: комментарий от emulek

Когда ты пишешь

strcpy(dest, src);
ты передаёшь обе строки «по ссылке» (т.е. передаёшь указатель). Однако, мусором становится только dest, но НЕ src.

Не strcpy, а strdup. Первая память не выделяет.

Anon
()
Ответ на: комментарий от Anon

Не strcpy, а strdup. Первая память не выделяет.

ты так ничего и не понял. В сишечке такого тупо НЕТ. Представь, что есть.

emulek
()
Ответ на: комментарий от emulek

Да нафиг мне голову ненужными сущностями забивать? В сишечке этого нет — меньше возможностей яйца прищемить. Хорошо.

Anon
()
Ответ на: комментарий от Anon

а ты никогда не завидовал php/питоно/жабо-обезьянам, что они могут написать string1 = string2, а ты — не можешь? Точнее можешь, но тебе ещё кучу строк с malloc/free надо запихать.

А вот в C++ это РАБОТАЕТ. Причём не просто работает, а работает также как в пхп/питоне/жабе, по ТВОЕМУ выбору.

Ну а обезьяны могут и дальше спорить о том, какая палка лучше: бамбуковая, или дубовая. Человек разумный берёт ту палку, которая наилучшим образом подходит к задаче. Ну т.е. юзает C++.

emulek
()
Ответ на: комментарий от emulek

Не завидовал. У них уж больно язык убогий. И, скажем, преобразовать int в 4 char'а я там не могу по-человечески (а в сях просто делаешь union).

А вот в C++ это РАБОТАЕТ

Там слишком много того, что мне не нужно. Поэтому плюсами не пользуюсь. Я же уже говорил.

Anon
()
Ответ на: комментарий от Anon

Не завидовал. У них уж больно язык убогий. И, скажем, преобразовать int в 4 char'а я там не могу по-человечески (а в сях просто делаешь union).

лучше-бы ты не int, а int32_t преобразовывал...

Там слишком много того, что мне не нужно. Поэтому плюсами не пользуюсь. Я же уже говорил.

да. Такой подход тоже не прост, и не всегда оправдан.

emulek
()
Ответ на: комментарий от emulek

лучше-бы ты не int, а int32_t преобразовывал...

Та я ж к слову. Понятно, что в union'е будет строго фиксированный тип. А еще для верности надо указать, что там нет выравнивания.

Такой подход тоже не прост, и не всегда оправдан.

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

Anon
()
Ответ на: комментарий от emulek

Ну а обезьяны могут и дальше спорить о том, какая палка лучше: бамбуковая, или дубовая. Человек разумный берёт ту палку, которая наилучшим образом подходит к задаче.

Пока не узнает про лом.

fmap
()
Ответ на: комментарий от menangen

Есть Go и D.

те же яйца, только в профиль

next_time ★★★★★
() автор топика
Ответ на: комментарий от emulek

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

void f1(std::string& s) {
    s.assign("aaaa");
}

void f2(std::string* s) {
    s->assign("aaaa");
}

vromanov ★★★
()
Ответ на: комментарий от fmap

Человек разумный берёт ту палку, которая наилучшим образом подходит к задаче.

Пока не узнает про лом.

ну ты это всяким лыжникам скажи, а то тупые же...

Ну и у старух клюку отбери, и лом да. Пусть радуются.

emulek
()
Ответ на: комментарий от vromanov

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

машинный код тут совершенно не при чём.

Ну и конечно в твоём примере много неясностей. Может для тебя новость, но селектор класса (->) ВНЕЗАПНО тоже можно перезагружать, причём многократно. Потом в коде для s->assign("aaaa"); вполне может быть очень много неожиданного для тебя...

emulek
()
Ответ на: комментарий от vromanov

Перегрузка опертатора не относится к вопросу

ещё раз: поясни, при чём тут вообще твой вопрос? В стандарте C/C++ вообще не определено понятие «машинный код», и всё, что с ним связано (адреса, вызовы функций, машинный стек, и даже сами байты). Посему, какая-то «одинаковость» или «разность» какого-то «машинного кода», просто не имеет никакого отношения к нашему спору.

Т.ч. учись, студент. Если уж решил спорить о C++, то и спорь о нём.

Ну а в C/C++ принято, что конструкция в рамках этого ЯП переводится в машинный код самым быстрым способом для этой архитектуры. Т.е. скажем __null, 0L, и false в рамках x86 равны 0x00000000. Это НЕ доказывает, что всё вышеперечисленное «одно и то же в рамках C++».

emulek
()
Ответ на: комментарий от vromanov

ну и да, наверное ты не понял, что такое «физический смысл» в моём посте ( Есть ли под С++ годные библиотеки для веб девелопмента? (комментарий) )? Ну дык я тебе объясню: к машинному коду это не имеет никакого отношения. Это имеет отношение к исходной задаче, в рамках перевода её в термины C++. Но никак НЕ к переводу C++ в рамки машинного кода.

Если у меня задача сделать генеалогическое древо, то для меня очевидно, что сын своего отца не может быть отцом своего отца. Это не имеет смысла. И машинный код тут совершенно не при чём. А вот C++ реализация — очень даже причём, если она допускает такой бред, и его поддерживает официально. Это ведёт к ошибкам, и требует лишних костылей, для того, что-бы эти ошибки искать и исправлять. Если программа прочитала такое древо из файла, то она обязана рухнуть с сообщением «файл с древом повреждён». Ибо делить на ноль — нельзя.

emulek
()

PHP заменить на c++ реально, но оправданно это только для серьёзных высоконагруженных проектов или если охота поковыряться к указателями, памятью, либами и прочими вкусностями. Для прочего удобнее юзать php, ибо хоть он кривой, тормозной и считается у сишников говноязыком, но писать код на нём быстрее и возможностей выстрелить себе в ногу таки меньше. А «Хочу пилить брёвна лобзиком, потому-что не хочу брать в руки пилу.» - это не серьёзно на мой взгляд.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Есть еще один случай, когда удобен C/C++. Это тот случай, когда в вебе надо реализовать логику, которая уже реализована на C/C++.

vromanov ★★★
()
Ответ на: комментарий от vromanov

Я бы сначала оценил затраты на создания вебморды на спп и создания нормального ифейса к логике, которую можно заюзать из того же рутнона (или любой другой руби) например.

Думаю в 98% случаев запилить ифейс проще, чем вебморду.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от next_time

false в рамках x86 не равен тождественно 0x00000000, ибо sizeof(bool) == 1 байт

ВНЕЗАПНО: 0x00000000 тождественно равен 0 и 0x00. Ну и ещё, sizeof считает в char'ах. Это так, на заметку.

emulek
()
Ответ на: комментарий от vromanov

Машинный код тут непричем, а выезд какого-то лица за границу причем.

а, у тебя про код тоже аллегория была? А я — не понял. И что оно символизирует, ваша аллегория?

emulek
()
Ответ на: комментарий от crutch_master

писать код на нём быстрее

4.2, я на С++ пишу код быстрее, чем на пхп

возможностей выстрелить себе в ногу таки меньше

4.2, в силу слабой типизации в пхп гораздо больше возможностей выстрелить себе в ногу

next_time ★★★★★
() автор топика
Ответ на: комментарий от nanoolinux

У нас не так.. Сам интерфейс очень небольшой. Также нам кроме консоли требуется высокопроизводительный REST интерфейс для управления данными в БД. Т.е. в С части пишутся просто функции, которые возращают JSON. Визуальная часть на JavaScript (ExtJs). Например сделан код, который позволяет редактировать любую таблицу из базы данных (что-то вроде phpMyAdmin), всякие просмотры сетевых трейсов, графиков итд.

vromanov ★★★
()
Ответ на: комментарий от emulek

1. а теперь покажите мне систему, где размер обычного символа не равен 1 байту, и что-то мне подсказывает, что компиляторы под такую систему стандарту соответствуют не полностью, так что пофиг что там в стандарте написано

2. https://ru.wikipedia.org/wiki/Тождество_(философия)

next_time ★★★★★
() автор топика
Ответ на: комментарий от emulek

MIX.

Из Кнута, что-ли? О да...

при чём тут философия?

При том, что абстрактные понятия, такие как «тождество» рассматриваются именно философией

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

При том, что абстрактные понятия, такие как «тождество» рассматриваются именно философией

мы тут про конкретный ноль говорили. Не?

emulek
()
Ответ на: комментарий от next_time

4.2, в силу слабой типизации в пхп гораздо больше возможностей выстрелить себе в ногу

Под «выстрелить себе в ногу» я имею ввиду ошибки при работе с памятью в твоём коде, а не всякую херню наподобие интерпретации типов.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Под «выстрелить себе в ногу» я имею ввиду ошибки при работе с памятью в твоём коде

ошибки с памятью - это как раз и есть «херня», ибо все специфические ошибки плюсов можно избежать автоматически, а вот ошибки интерпретации типов во второсортных ЯП со слабой статической/динамической типизацией - это, действительно, полярный лис

next_time ★★★★★
() автор топика
Ответ на: комментарий от emulek

«в рамках x86»

да, ибо само понятие «архитектура x86» - философское, напомню, что математика - подмножество философии

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

да, ибо само понятие «архитектура x86» - философское, напомню, что математика - подмножество философии

ну тогда погугли, что такое «подмножество», и почему некоторые вещи внутри подмножества являются тождественными, хотя в общем множестве не являются. И почему бывает и по другому.

emulek
()
Ответ на: комментарий от next_time

а вот ошибки интерпретации типов во второсортных ЯП со слабой статической/динамической типизацией - это, действительно, полярный лис

вообще-то в таких ЯП очень жёсткие и хорошо документированные правила преобразования типов. И если ты их не осилил, то проблема в тебе, а не в ЯП.

В сишечке и плюсах правила куда мягче, а часто их тупо нет (UB), ну и полярный лис там потому куда как полярнее.

Ну вот пример:

<?php

$x = 7;
echo $x++ + ++$x;
echo $x;

?>

всегда даёт 16, 9

А в этой нашей сишечке... Сам понимаешь. Может тоже 16,9 дать. Сегодня, у тебя. Если луна в третьем доме.

emulek
()
Ответ на: комментарий от emulek

тождество - это абсолютное соответствие одной сущности другой, поэтому 0 типа чар не тождественнем 0 типа инт

next_time ★★★★★
() автор топика
Ответ на: комментарий от emulek

вообще-то в таких ЯП очень жёсткие и хорошо документированные правила преобразования типов

хорошо документированные инструкции по наступанию на грабли, ок

echo $x++ + ++$x;

ССЗБ

next_time ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.