Здравствуйте, Shmj, Вы писали:
S>Вот пример: https://www.programiz.com/online-compiler/71UkVydEXRPWu
S>S>#include <iostream>
S>int main() {
S> const char* str1 = "hello";
S> const char* str2 = "hello";
S> std::cout << "Address of str1: " << static_cast<const void*>(str1) << std::endl;
S> std::cout << "Address of str2: " << static_cast<const void*>(str2) << std::endl;
S> return 0;
S>}
S>
S>— для вас очевидно что str1 и str2 имеют единый адрес? Разумно?
Не очевидно, но для желающих есть опция компилятора, т.н. "string pooling" ( /GF ).
S>S>#include <iostream>
S>class MyClass {
S>public:
S> int value;
S> constexpr MyClass(int v) : value(v) {}
S>};
S>int main() {
S> constexpr MyClass obj1(5);
S> constexpr MyClass obj2(5);
S> std::cout << "Address of obj1: " << &obj1 << std::endl;
S> std::cout << "Address of obj2: " << &obj2 << std::endl;
S> return 0;
S>}
S>
S>Имеем constexpr в конструкторе и constexpr при создании — но выделяются разные участки памяти. Зачем? Сложно проверить и для всех таких constexpr/constexpr не выделять память по 100 раз?
Если пользователь создал два константных объекта, значит ему это нужно.
S>Вроде бы мелочь, а открываются колоссальные возможности по оптимизации — как то если уже обработали такой же (с таким же адресом объект) — то можно повторно не обрабатывать а выдать из кеша. Узнал что в Dart так сделали и какие возможности открыла такая, казалось бы, мелочь — и до сих пор не могу отойти от этой мысли — насколько концепция поменялась.
S>Или как-то можно это сделать хитроумными способами?
А для этого существует "синглетон"!