Сообщение 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
То есть, ты возмущаешься тому, что создаётся два объекта вместо одного в то время, когда вообще никаких объектов не создаётся. И всё из-за твоих невежественных попыток определить количество компайл-тайм объектов, через взятие их адресов! Капец, блин, целую теорию построил на своём невежестве.
S>Если константный класс (конструктор с 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
Когда ты выводишь на печать адреса, компилятор не видит, что происходит с этими адресами внутри РАН-ТАЙМОВОГО std::basic_ostream<char, std::char_traits<char> >::operator<<(int). Поэтому он вынужден честно сгенерировать два РАНТАЙМОВЫХ объекта.
То есть, ты возмущаешься тому, что создаётся два объекта вместо одного в то время, когда вообще никаких объектов не создаётся. И всё из-за твоих невежественных попыток определить количество компайл-тайм объектов, через взятие их адресов! Капец, блин, целую теорию построил на своём невежестве.
S>Если константный класс (конструктор с 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). Поэтому он вынужден честно сгенерировать два РАНТАЙМОВЫХ объекта.
То есть, ты возмущаешься тому, что создаётся два объекта вместо одного в то время, когда вообще никаких объектов не создаётся. И всё из-за твоих невежественных попыток определить количество компайл-тайм объектов, через взятие их адресов! Капец, блин, целую теорию построил на своём невежестве.