Ivan
Mikhail
Потому, что это может быть либа, которая может даже из рантайма грузиться
когда юзаешь либу, декларация функции всегда находится в хедере. и компилятор это проверяет, в самой либе const - лишнее
Andrew
В смысле? Ты из кода если вызываешь, то компилятор проверит. Если уже рантайм, то пофигу вообще
Если вызов из либы, то скорей линковщик проверит. Но если ты грузишь либу в рантайме, тут он уже ничего не проверит
Ivan
Раз не проверит, то зачем const?
Andrew
когда юзаешь либу, декларация функции всегда находится в хедере. и компилятор это проверяет, в самой либе const - лишнее
хедер может быть например от другой версии либы, что породит ошибки совместимости. Ну контракт же
Andrew
тут уже на откуп программисту видимо
Не только ему. Сисадминам и тем, кто мейнтенит дистрибутив
Mikhail
Не только ему. Сисадминам и тем, кто мейнтенит дистрибутив
скорее дистрибутивщикам. если сисадмин занимается такими грязными хаками то это нездоровая ситуация
Andrew
скорее дистрибутивщикам. если сисадмин занимается такими грязными хаками то это нездоровая ситуация
Возможна ситуация даже с повреждением ФС и последующем восстановлением старой версии файла хедера
Andrew
Поэтому в мангле const нафиг не нужен
Как по мне, это информация не лишняя и раз компилятор манглит цпп код, ее хорошо бы добавлять. Как-то это не консистентно
Andrew
Интересно, а гцц так же делает?
Ivan
MSVC аналогично.
Что там minGW и GCC?
Matway
Что там minGW и GCC?
Нет под рукой.
Mikhail
Возможна ситуация даже с повреждением ФС и последующем восстановлением старой версии файла хедера
ну может быть.. правда вероятность оч маленькая.. как правило там raid, значит остается косяк тех кто писал код ФС. а в 2017 году такое сложно представить
Mikhail
хотя все может быть
Mikhail
В моей практике такое было
именно не изза жеского диска, а изза ошибки разрабов?
Matway
Нет под рукой.
Хотя как же нет. Вот: https://godbolt.org/g/b3TynC
cyberzx 🇷🇺
это от компилятора не зависит. надо читать доки по ABI и манглингу
Matway
Смотрим на демангленные имена (справа). const пропал. В общем, myth busted!
cyberzx 🇷🇺
ну то есть завист от кампелятора тем, что компилятор использует тот или иной ABI
Andrew
именно не изза жеского диска, а изза ошибки разрабов?
Из-за жёсткого диска было 1 раз. Из-за ошибки разрабов было много больше ))
cyberzx 🇷🇺
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
Andrew
Ext4 при больших нагрузках и изношенном железе прекрасно проебывает файлы
Mikhail
меня задолбал btrfs.. надоело снепшоты snapper'ом подчищать
cyberzx 🇷🇺
Note that top-level cv-qualifiers specified on a parameter type do not affect the function type directly (i.e., int(*)(T) and int(*)(T const) are the same type), but in expression contexts (such as decltype arguments) they do matter and must therefore be encoded in <function-param>, unless the parameter is used as an rvalue of a known non-class type (in the latter case the qualifier cannot affect the semantics of the expression).
Mikhail
Всё-таки теория оказалась верной)
интересно а что будет если либу подгрузить dlload'ом, и вызвать функцию по неконстантному прототипу?
Mikhail
по идее должно прокатить
Berkus
Ext4 при больших нагрузках и изношенном железе прекрасно проебывает файлы
XFS без всяких нагрузок проебывает файлы если комп выключить
Berkus
открываешь /etc/fstab и вырубаешь комп, на рестарте она "для безопасности" забивает fstab нулями. профит
Mikhail
эх.. опять сломали с++)
cyberzx 🇷🇺
по идее должно прокатить
в ABI вызова (System V) точно нет ничего про константность параметров. С точки зрения ABI все параметры передаются by-value
Anatoly
Всё-таки теория оказалась верной)
согласен, но компилятор не сбрасывает со счетов const параметра
Stanislav
Anatoly
это разные вещи
Ivan
еее)
Matway
Привет. Мы о другом говорим.
cyberzx 🇷🇺
const char * const __ptr64 vs const char* __ptr64
Ivan
Так стоп! Манглится конст или нет???
cyberzx 🇷🇺
в ABI вызова (System V) точно нет ничего про константность параметров. С точки зрения ABI все параметры передаются by-value
вот если бы там указывалось, что константные параметры передаются только в спец регистрах(через которые не передаются обычные параметры), то была бы ошибка. но ни под виндой, ни под линуксом не так
cyberzx 🇷🇺
cyberzx 🇷🇺
Привет )
Ivan
О боже. За всем не уследишь
Matway
Так стоп! Манглится конст или нет???
На практике (Clang, GCC, MSVC) - нет, не манглится.
cyberzx 🇷🇺
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
cyberzx 🇷🇺
From GCC version 3 onwards the GNU C++ compiler uses an industry-standard C++ ABI, the Itanium C++ ABI.
cyberzx 🇷🇺
да AMD64 ABI тоже не только на amd используется)
Matway
Фух...
ICC и ELCC туда же. В общем не манглится никем.
Ivan
Тада!
Mikhail
я тут подумал.. по идее все равно по какому прототипу (имеется в виду const или не const) вызывать функцию.. констанстность объекта в функции проверяется и гарантируется на этапе сборки либы. следовательно прототип с const'ом - это просто вспомогательная информация для разработчика. логика работы самой функции никак не изменится. ваш К.О.
Mikhail
значит получается не бага
Anatoly
да почему нельзя?
Stanislav
Привет. Мы о другом говорим.
про манглирпование константов же или где :)
Ivan
Поэтому функция с конст аргументом и не конст одна и та же
Matway
про манглирпование константов же или где :)
Про то, что const у верхнего значения не идёт в манглинг. void test(int*) для манглинга идентично void test(int* const)
Matway
да почему нельзя?
Потому что пользователю (одной из сторон исполнения контракта) эта информация вредит.
Anatoly
чем?
Stanislav
Matway
Исходники и версию компилятора, пожалуйста.
Stanislav
__declspec(dllexport) void foo1(char* s) { while(*s++) {} } __declspec(dllexport) void foo1(const char*s) { while(*s++) {} } __declspec(dllexport) void foo1(int * const s) { } __declspec(dllexport) void foo2(int * s) { } 2017 студия
Matway
чем?
Тем же, чем может навредить любой бессмысленный мусор - отвлекает от работы :)
Anatoly
foo1 vs foo2
Andrei
foo1 vs foo2
:D Он почти нас обманул!
Ivan
Const очень полезен. Я использую const в душе и перед сном
Anatoly
Тем же, чем может навредить любой бессмысленный мусор - отвлекает от работы :)
это не мусор, а запрет на использование параметра в качестве переменной
Matway
А вот это скриншот какого окошка?
Stanislav
foo1 vs foo2
да, это подозрительно, но манглирует по разному, но компилер считает одинаковые функции
Stanislav
А вот это скриншот какого окошка?
fileinfo плагин для тотала, андекорейт манглинга показывает