Здравствуйте, пффф, Вы писали:
S>>Тут же не только в том дело, что объект не расходует память и это гарантированно. Важно что можно утверждать что объект не изменился и можно не вызывать повторно его методы. П>Плюсовый компилятор и так это делает, если может доказать. А верить программисту на слово, который "мамой клянусь, объект константный, метод вернёт то же самое" компилятору никак нельзя
Чуть подправил код:
#include <iostream>
class MyClass {
public:
int value;
constexpr MyClass(int v) : value(v) {}
};
int main() {
const MyClass* obj1 = new MyClass(5);
const MyClass* obj2 = new MyClass(5);
std::cout << "Address of obj1: " <<static_cast<const void*>(obj1) << std::endl;
std::cout << "Address of obj2: " << static_cast<const void*>(obj2) << std::endl;
return 0;
}
— тут есть гарантия что не нужно выделять память по 100 раз?
Здравствуйте, rg45, Вы писали:
R>Вот ты непрошибаемый. Тебе не приходило в голову, что, если б не твои операции взятия адресов, то компилятор мог бы вообще не создавать никаких объектов? Вот тебе пример, обрати внимание на созданный машинный код:
R>https://godbolt.org/z/nrjM1rhMa
Ну вот этого я и ждал, лучше опозориться и узнать что-то полезное, чем с гордостью сохранять невежество.
Ты прикалываешься, что ли? Ты явно создаешь два объекта в динамической памяти, а компилятор должен вместо двух объектов создать один? С какого перепуга?
Я уже молчу, что за такой код нужно подсрачниками гнать из профессии.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Ты прикалываешься, что ли? Ты явно создаешь два объекта в динамической памяти, а компилятор должен вместо двух объектов создать один? С какого перепуга?
Если объекты константные, не подлежат изменению, абсолютно одинаковые — то зачем два раза выделять память?
R>Я уже молчу, что за такой код нужно подсрачниками гнать из профессии.
А как еще продемонстрировать проблему? Смартпоинтеры будут рабоать так же.
Если конструируете UI-дерево, добавляете в список одинаковые const-объекты — они постоянно будут создаваться заново.
Здравствуйте, Shmj, Вы писали:
S>Если объекты константные, не подлежат изменению, абсолютно одинаковые — то зачем два раза выделять память?
Во-первых, нет здесь никаких константных объектов. Ты ссылаешься на них как на константные, но создаются они как неконстантные. Снятие константности через const_cast и использование этих объектов как неконстантных вполне правомерно.
S>А как еще продемонстрировать проблему? Смартпоинтеры будут рабоать так же.
Так если ты не можешь продемонстрировать проблему, может, и проблемы никакой нет?
S>Если конструируете UI-дерево, добавляете в список одинаковые const-объекты — они постоянно будут создаваться заново.
У тебя есть все возможности для того, чтобы решить эту проблему собственными силами.
Вообще, ты подбешивать уже начинаешь. Иди учи матчасть.
--
Справедливость выше закона. А человечность выше справедливости.
S>- тут есть гарантия что не нужно выделять память по 100 раз?
Зачем два раза создавать объект в куче? Твои гениальные предложения сводятся к тому, что у вас на дарте думать не принято, и в компилятор в попытках исправить то, что вы там наколбасите, придумали эту странную оптимизацию На плюсах разработчик обычно достаточно опытный, и продумывает архитектуру, и у него одинаковых неизменяемых объектов просто не будет
Здравствуйте, rg45, Вы писали:
R>Во-первых, нет здесь никаких константных объектов. Ты ссылаешься на них как на константные, но создаются они как неконстантные. Снятие константности через const_cast и использование этих объектов как неконстантных вполне правомерно.
Хорошо, покажите как создавать константные объекты. Может я не правильно создаю?
R>У тебя есть все возможности для того, чтобы решить эту проблему собственными силами.
Для этого нужно все одинаковое контролировать вручную.
Здравствуйте, Marty, Вы писали:
S>>Если конструируете UI-дерево, M>Задача весьма редкая
В Flutter — основной фреймворк Dart — это постоянно далается. Причем посмотрите как — вроде бы императивно, но выглядит как JSON — практически декларативно, но с возможностью при необходимости спуститься до императивности.
Убеждение что UI лучше описывать на XML а не на ЯП — только лишь вера, ни на чем не основанная.
S>>добавляете в список одинаковые const-объекты — M>Не добавляй. Делай копию shared_ptr'а. Лучше продумывай архитектуру.
Вручную слишком сложно контролировать.
M>Это не слишком дорого. А сколько будет времени тратится на проверку, что такой объект уже создан?
Так по словарю во время компиляции проверить — не долго. Даже 1 млн. объектов будут за секунду в словаре найдены.
Здравствуйте, Shmj, Вы писали:
S>Хорошо, покажите как создавать константные объекты. Может я не правильно создаю?
Для начала, мне бы хотелось бы убедиться, что ты правильно понимаешь этот термин. То, что ты лепишь к конструктору "constexpr", а потом создаёшь объект в динамической памяти, указывает на то, что у тебя в голове полная каша. Я тебе уже сказал: иди учи матчасть.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Marty, Вы писали:
M>Зачем два раза создавать объект в куче? Твои гениальные предложения сводятся к тому, что у вас на дарте думать не принято, и в компилятор в попытках исправить то, что вы там наколбасите, придумали эту странную оптимизацию На плюсах разработчик обычно достаточно опытный, и продумывает архитектуру, и у него одинаковых неизменяемых объектов просто не будет
Два раза создавать не нужно — достаточно одного раза, т.к. объект не изменяется и всем хватит ссылки на одно и то же.
Здравствуйте, rg45, Вы писали:
R>Для начала, мне бы хотелось бы убедиться, что ты правильно понимаешь этот термин. То, что ты лепишь к конструктору "constexpr", а потом создаёшь объект в динамической памяти, указывает на то, что у тебя в голове полная каша. Я тебе уже сказал: иди учи матчасть.
constexpr к конструктору — а как мне еще обозначить что не нужно 100 раз выделять память и хватит одного экземпляра на всю программу для всех. const — конструкторов нет. Поля сделал const. Что еще нужно?
Здравствуйте, Shmj, Вы писали:
S>constexpr к конструктору — а как мне еще обозначить что не нужно 100 раз выделять память и хватит одного экземпляра на всю программу для всех. const — конструкторов нет. Поля сделал const. Что еще нужно?
Ещё нужно на монитор подышать и посидеть на клавиатуре.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
S>constexpr к конструктору — а как мне еще обозначить что не нужно 100 раз выделять память и хватит одного экземпляра на всю программу для всех. const — конструкторов нет. Поля сделал const. Что еще нужно?
Про паттерны проектирования слышал, что-нибудь? Если нет, то это время пришло.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
R>>У тебя есть все возможности для того, чтобы решить эту проблему собственными силами.
S>Для этого нужно все одинаковое контролировать вручную.
На С++ и так постоянно гонят, представляю, что начнется, если компиляторы начнут ещё делать то, о чём их не просят.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
S>>constexpr к конструктору — а как мне еще обозначить что не нужно 100 раз выделять память и хватит одного экземпляра на всю программу для всех. const — конструкторов нет. Поля сделал const. Что еще нужно?
R>Про паттерны проектирования слышал, что-нибудь? Если нет, то это время пришло.
Никаким паттерном ты этого не решишь. Можно создать объект и после этого проверить если уже такой существует в словаре — то не включать в словарь повторно. Но для этого придется сначала создать и выполнять проверки на этапе выполнения.
Если бы в C++ была возможность создать константный объект + компилятор бы понимал что нет смысла дублировать их — было бы куль.
Здравствуйте, Shmj, Вы писали:
S>Никаким паттерном ты этого не решишь. Можно создать объект и после этого проверить если уже такой существует в словаре — то не включать в словарь повторно. Но для этого придется сначала создать и выполнять проверки на этапе выполнения.
Паттерны проектирования — это про подходы к проектированию, а не про этапы выполнения или компиляции. Многие из распространенных паттернов имеют решения как на этапе выполнения, так и на этапе компиляции. И ты бы это знал, если меньше словоблудил, а больше уделял внимания изучению языка и практике.
Да и стремление всё на свете впихнуть в компайл-тайм нездоровое само по себе. Попахивает преждевременной оптимизацией.
S>Если бы в C++ была возможность создать константный объект + компилятор бы понимал что нет смысла дублировать их — было бы куль.
А если бы у бабушки была борода, то она была бы дедушкой.
--
Справедливость выше закона. А человечность выше справедливости.