Информация об изменениях

Сообщение Re[5]: Про идентичность const от 23.01.2025 14:49

Изменено 23.01.2025 14:57 rg45

Re[5]: Про идентичность const
Здравствуйте, Shmj, Вы писали:

S>Если константный класс (конструктор с const) — то ограничения не касаются тела методов, к сожалению Но просто для себя знайте что такие методы не должны иметь т.н. побочных эффектов. Если допустили побочный эффект — ССЗБ, не нужно было делать const-конструктор.


S>Сделали так, чтобы все-таки можно было работать с не-константными внешними объектами, иначе будет очень узкая сфера применения — а сейчас используется на полную. Т.е. просто для себя знать — не делать const, если методы не чистые. Компилятор пока не проверяет.


Вот ты непрошибаемый. Тебе не приходило в голову, что, если б не твои операции взятия адресов, то компилятор мог бы вообще не создавать никаких объектов? Вот тебе пример, обрати внимание на созданный машинный код:

https://godbolt.org/z/nrjM1rhMa

    constexpr MyClass obj1(5);
    constexpr MyClass obj2(5);

    std::cout << obj1.value << std::endl;
    std::cout << obj2.value << std::endl;

sub     rsp, 8
mov     esi, 5
mov     edi, OFFSET FLAT:std::cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) [clone .isra.0]
mov     esi, 5
mov     edi, OFFSET FLAT:std::cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) [clone .isra.0]
xor     eax, eax
add     rsp, 8
ret


То есть, ты возмущаешься тому, что создаётся два объекта вместо одного в то время, когда вообще никаких объектов не создаётся. И всё из-за твоих невежественных попыток определить количество компайл-тайм объектов, через взятие их адресов! Капец, блин, целую теорию построил на своём невежестве.
Re[5]: Про идентичность const
Здравствуйте, Shmj, Вы писали:

S>Если константный класс (конструктор с const) — то ограничения не касаются тела методов, к сожалению Но просто для себя знайте что такие методы не должны иметь т.н. побочных эффектов. Если допустили побочный эффект — ССЗБ, не нужно было делать const-конструктор.


S>Сделали так, чтобы все-таки можно было работать с не-константными внешними объектами, иначе будет очень узкая сфера применения — а сейчас используется на полную. Т.е. просто для себя знать — не делать const, если методы не чистые. Компилятор пока не проверяет.


Вот ты непрошибаемый. Тебе не приходило в голову, что, если б не твои операции взятия адресов, то компилятор мог бы вообще не создавать никаких объектов? Вот тебе пример, обрати внимание на созданный машинный код:

https://godbolt.org/z/nrjM1rhMa

    constexpr MyClass obj1(5);
    constexpr MyClass obj2(5);

    std::cout << obj1.value << std::endl;
    std::cout << obj2.value << std::endl;

sub     rsp, 8
mov     esi, 5
mov     edi, OFFSET FLAT:std::cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) [clone .isra.0]
mov     esi, 5
mov     edi, OFFSET FLAT:std::cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) [clone .isra.0]
xor     eax, eax
add     rsp, 8
ret


Когда ты выводишь на печать адреса, компилятор не видит, что происходит с этими адресами внутри РАН-ТАЙМОВОГО std::basic_ostream<char, std::char_traits<char> >::operator<<(int). Поэтому он вынужден честно сгенерировать два РАНТАЙМОВЫХ объекта.

То есть, ты возмущаешься тому, что создаётся два объекта вместо одного в то время, когда вообще никаких объектов не создаётся. И всё из-за твоих невежественных попыток определить количество компайл-тайм объектов, через взятие их адресов! Капец, блин, целую теорию построил на своём невежестве.