Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 176 177 [178] 179 180 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2656
,
|
|
|
|
Цитата DesweR @ пока С++ не научится корректно копировать их экземпляры (копирующие конструкторы для классов с иерархией наследования не подходят) Сделать метод clone() - задача непосильная для дельфиста. Цитата DesweR @ или хотя бы отличать те экземпляры, которые можно копировать, от тех, которые нельзя копировать (концептов пока нет) Я когда-нибудь не выдержу и во всей красоте матерного русского выскажу всё, что я думаю о вас, г. DesweR. Вот при чём тут концепты? Почему нельзя определить, что копируется, а что - нет? Откуда вы вообще изволили взять весь этот бред? Короче, отсыпете, а? |
|
Сообщ.
#2657
,
|
|
|
|
Цитата MyNameIsIgor @ Сделать метод clone() - задача непосильная для дельфиста. Как раз для нас не проблема унаследоваться от TPersistent, входящему в стандартную RTL, и переопределить AssignTo Цитата MyNameIsIgor @ Вот при чём тут концепты? Про концепты говорил D_KEY, n-ое кол-во страниц назад. Добавлено Цитата MyNameIsIgor @ Почему нельзя определить, что копируется, а что - нет? Без понятия, как в С++ установить это обобщённо и для классов и для других типов? |
|
Сообщ.
#2658
,
|
|
|
|
Цитата DesweR @ Про концепты говорил D_KEY, n-ое кол-во страниц назад. И что, что он говорил про концепты? Как это относится к запрету конструктора копирования и оператора присваивания для полиморфных классов? Цитата DesweR @ Без понятия, как в С++ установить это обобщённо и для классов и для других типов? Что "это"? Если разработчик копирование запретил - его нет. Разрешил - есть. Что тут "устанавливать" то? |
|
Сообщ.
#2659
,
|
|
|
|
Цитата MyNameIsIgor @ Как это относится к запрету конструктора копирования Причём тут конструктор копирования? Забудь про него, он не работает для классов с иерархией наследования (т.е. срабатывает только для последнего в иерархии). Цитата MyNameIsIgor @ Если разработчик копирование запретил - его нет. Разрешил - есть. Что тут "устанавливать" то? Без конструкторов копирования, как будешь определять копируемый или не копируемый экземпляр класса? |
|
Сообщ.
#2660
,
|
|
|
|
Цитата DesweR @ Причём тут конструктор копирования? Забудь про него, он не работает для классов с иерархией наследования (т.е. срабатывает только для последнего в иерархии). Цитата DesweR @ Без конструкторов копирования, как будешь определять копируемый или не копируемый экземпляр класса? Если нет конструктора копирования и оператора присваивания, то и скопировать не получится. |
|
Сообщ.
#2661
,
|
|
|
|
Цитата MyNameIsIgor @ Если нет конструктора копирования и оператора присваивания, то и скопировать не получится.Да даже если он и есть - скопировать целиком не получится, т.к. конструкторы копирования предков не вызываются |
|
Сообщ.
#2662
,
|
|
|
|
Цитата DesweR @ Да даже если он и есть - скопировать целиком не получится, т.к. конструкторы копирования предков не вызываются Да тот, кто их сделает для полиморфных классов и никоим образом не позаботится о проблеме срезки, пойдёт за ворота. Этот человек не знает C++. И вообще-то не предков, а потомков, ага. Скопировать предков то как раз можно. |
|
Сообщ.
#2663
,
|
|
|
|
Цитата DesweR @ Допустимо и нужно, вот к примеру строковый тип в Delphi - string, он имеет счетчик ссылок и автоматически увеличивает размер памяти под себя, переменная этого типа представляет собой указатель на значение, хранящиеся в динамической памяти. То есть переменная будет указателем на область памяти, которая хранит лишь счетчик ссылок и указатель на динамические данные? Или как? Зачем? В С++ тип std::string может также хранить указатель на динамически выделенную память для строки и размер этих данных. Он точно также расширяется сам и может использовать CoW. Цитата Это никак не связано с ссылочным типом. Это вопрос внутренней реализации класса string. Ты описываешь обычный CoW, который, кстати, в условиях многопоточности не так эффективен, как кажется.эффективная работа со строками, при копировании строки - копируется только указатель, при изменении строки - создаётся отдельная копия; Цитата нет необходимости вручную управлять памятью, она автоматически изменяется под размер строки; Опять же, это никак не связано с ссылочными типами. std::string ведет себя так же. Цитата не подвержен эксплойтам на переполнении стека, т.к. значение хранится в динамической памяти. Опять же, это никак не связано с ссылочными типами. std::string ведет себя так же. Цитата Ещё примеры: динамические массивы, интерфейсы, анонимные методы, классы И примером чего это все является? Кстати, речь о размещении вообще не идет. Цитата (тут уже холиварили, а пока С++ не научится корректно копировать их экземпляры (копирующие конструкторы для классов с иерархией наследования не подходят) или хотя бы отличать те экземпляры, которые можно копировать, от тех, которые нельзя копировать (концептов пока нет), то разговаривать не о чем). Совершенно бессмысленный вброс. Единственное, о чем тут можно говорить, так это об организации "стандартного" виртуального конструктора копирования, причем в стиле С++(например, без обязательного размещения в динамической памяти). Что-то вроде того, что предлагал Mastrerkent в соседнем холиваре: Цитата Masterkent ![]() ![]() Base &base = derived; Base *p_copy_1 = new virtual Base(base); virtual Base copy_2(*this); Добавлено korvin, решил не отвечать ? |
|
Сообщ.
#2664
,
|
|
|
|
DesweR, есть кусочек кода (схематично).
![]() ![]() VAR str : STRING; { Надеюсь, я правильно понял имя типа } FUNCTION func(VAR Ch:Char):Boolean; BEGIN Ch := Succ(Ch); func := Ch <> Chr(255) END; BEGIN str := 'It''s some string'; FOR i:=1 TO Length(str) DO func(str[i]) END. P.S. Насколько мне известно, практические исследования показали бесполезность ленивого копирования вкупе с возможностью индексирования отдельных элементов для не-только-чтения. Оверхед в точках индексирования и синхронизация слизывают весь выигрышь. В частных случаях имеют место отклонения в обе стороны. Ссылок пока не могу дать, вечером попробую погуглить. Если кто владеет инфой, этой или противоположной, милости прошу. |
|
Сообщ.
#2665
,
|
|
|
|
Qraizer, string в Delphi реентерабелен.
|
|
Сообщ.
#2666
,
|
|
|
|
И вообще, DesweR, ты походу просто попутал понятия. Ссылочный тип - это одно, а внутренняя его реализация - это совсем другое. Пусть он хранит ссылки на данные, счётчик использования и не копирует контент без нужды. Если он при этом обладает прозрачной семантикой значения, он уже не ссылочный.
Добавлено Romkin, не сомневаюсь. Вопрос был в эффективности ленивого копирования с его сложностью реализации по сравнению с простым хранением значения безо всяких распальцовок. |
|
Сообщ.
#2667
,
|
|
|
|
![]() ![]() #include<iostream> class Base { public: virtual void Method(){std::cout<<"Base";} }; class Derive:public Base { public: void Method(){std::cout<<"Derive";} }; void Func(Base b) { b.Method(); } int main() { Derive d; Func(d); } Выводит Base. А как же полиморфизм ? |
|
Сообщ.
#2668
,
|
|
|
|
IL_Agent, от тебя ну никак не ожидал.
Сто раз обсуждали. Это некорректный код. Требуешь создание нового объекта конкретного типа - какой тут полиморфизм? Ничего не сделал, чтобы предотвратить срез(конструирование объекта базового класса из объекта производного) - какой ты программист? |
|
Сообщ.
#2669
,
|
|
|
|
Цитата D_KEY @ IL_Agent, от тебя ну никак не ожидал. Сто раз обсуждали. Это некорректный код. Требуешь создание нового объекта конкретного типа - какой тут полиморфизм? Ничего не сделал, чтобы предотвратить срез(конструирование объекта базового класса из объекта производного) - какой ты программист? В C# нельзя делать структуры (типы значений) базовыми или производными типами других классов или структур. Хотя они неявно наследуются от класса ValueType. Поэтому такой код в принципе не написать (ну, по крайней мере я не знаю как ). |
|
Сообщ.
#2670
,
|
|
|
|
Цитата D_KEY @ IL_Agent, от тебя ну никак не ожидал. Сто раз обсуждали. Это некорректный код. Требуешь создание нового объекта конкретного типа - какой тут полиморфизм? Ничего не сделал, чтобы предотвратить срез(конструирование объекта базового класса из объекта производного) - какой ты программист? это некорректный язык. и как после этого можно C++ называть объектно-ориентированным? =) |