Vladislav
впрочем, с сортировкой строки ни gcc ни clang все равно не справляются https://godbolt.org/g/cLVujZ
Igor
аб какое-то обмазывание контейнеров для подсказок компилятору
Имхо, если что-то и обмазывать - так это сами скоуп-гарды, а все остальное считать годным к оптимизации Естественно комитет на такое не пойдет, ибо баквард кококомпатибилити - из легаси кода, портируемого на новые компиляторы начнут пропадать непомеченные скоуп-гарды написанные в 1990-х, и программы пойдут в разнос. А про предупреждения компилятора в стандарте ни слова, да... И вообще, я наверняка еще какие-нибудь зловредные примеры упустил из виду
Anton
"кококомпатибилити" - архиважно
Vladislav
по сайд-эффектам в деструкторе?
к сожалению, new/delete в текущем стандарте считаются side-effectами, как я понимаю
Vladislav
А это не так разве?
формально - так, но в стандарте уже есть примеры того, что некоторыми формальностями можно пренебречь для оптимизации (см. RVO, например). Имхо, тут тот же случай
Igor
"кококомпатибилити" - архиважно
Я знаю, здесь сарказм направлен не на комитет, а на общее положение дел. Что где-то там в безднах информационного пространства существуют кодовые базы, набитые навозом, которые обязательно сломаются от таких ломающих новостей. Ибо варнинги остаются варнингами, а не еррорами, а местный компилятор даже после апгрейда не сможет распознать неиспользуемую переменную и предупредить
Igor
Вы ещё предложите legacy-код собирать с -Werror.
Его уже поздно собирать с -Werror(( а так да, ябпредложил
RattenKong 🦧🐀🦍️
Vladislav
Вы ещё предложите legacy-код собирать с -Werror.
а вот не надо собирать legacy-код! /s
Viacheslav
по сайд-эффектам в деструкторе?
В любом случае будет работать только для POD типов. Ну и не всегда достаточно только на деструктор смотреть. Допустим, написал я себе класс, который помогает указатели на С++ объекты в lua_setglobal запихнуть. Деструктор мне, положим, вообще не нужен, потому что когда надо будет, то следующий helper положит то, что надо.
RattenKong 🦧🐀🦍️
это сайд-эффект, совсем отдельный от new/delete
Но пример вектор + сорт, по сути, тоже такой, там не только аллокация, но и действия с памятью аллоцированной
Vladislav
про POD типы - не очень понятно
Vladislav
Но пример вектор + сорт, по сути, тоже такой, там не только аллокация, но и действия с памятью аллоцированной
в идеальном мире - это не сайдэффект, если эти данные потом не используются (по модулю использования лишней памяти и cpu)
Viacheslav
про POD типы - не очень понятно
Вызов деструкторов у элементов вектора — тоже side-effect потенциальный. Поэтому гарантированно выкинуть вектор, как не использующийся, по-моему только для таких вот plain old типов получится.
RattenKong 🦧🐀🦍️
в идеальном мире - это не сайдэффект, если эти данные потом не используются (по модулю использования лишней памяти и cpu)
А что если вместо сорта тестирование аллокатора, анпример? Тоже данные потом не нужны
RattenKong 🦧🐀🦍️
А что если вместо сорта тестирование аллокатора, анпример? Тоже данные потом не нужны
Т.е. аллоцируется весь пул, допустим, а потом просто освобождаем
Vladislav
Т.е. аллоцируется весь пул, допустим, а потом просто освобождаем
как это меняет существующую картину, когда с оптимизатором в бенчмарках/тестах нужно специально бороться?
Viacheslav
на этапе компиляции мы знаем, что там за деструктор (если он не виртуальный), на основе этого можно решать
А если у нас DLL и header к ней? Там откуда компилятор узнает, что происходит?
Vladislav
Vladislav
точно так же как и не получится эти вызовы заинлайнить
Igor
никак, в этом случае оптимизация не получилась
а где именно можно почитать про сайд эффекты? или любой вызов функций и методов уже считается за оный?
Крылатый
а где именно можно почитать про сайд эффекты? или любой вызов функций и методов уже считается за оный?
Сайд-эффект — побочный эффект — любое, что изменяет среду выполнения.
Крылатый
IO — побочный эффект, например.
Крылатый
Если при вызове функции её аргумент изменяется ею — тоже побочный эффект. Т.е. int tits_size = 2; decrease(&tits_size); // теперь tits_size равны 0
Крылатый
Если я правильно помню.
Крылатый
Нет бы увеличить
Не люблю большие, сорь
vladislav
Не люблю большие, сорь
Ну 3 не большие, норм
Constantine
После этого будет замечательный вопрос. Как обмазывать неиспользуемые скоуп гарды в параметрах функции
Constantine
Или например в качестве члена класса
Constantine
И как невинное удаление функции, дампящей скоуп гард член класса, приведет к его выбрасыванию и поломанному коду
Igor
После этого будет замечательный вопрос. Как обмазывать неиспользуемые скоуп гарды в параметрах функции
я неправильно выразился - не каждую переменную обмазывать, а в описании её класса указать [[no_optimized_away]], дабы компилятор ни в коем разе не вздумал выкидывать переменные этого типа, и вообще заикаться что они мол неиспользуемые
Viacheslav
Они пусть для memset для начала такое добавят.
Иван
[[maybe_unused]] такое не умеет?
Иван
Или его только в месте использования можно?
Constantine
[[maybe_unused]] такое не умеет?
Это вообще супресс варнинга
Иван
Это вообще супресс варнинга
Я понимаю, вопрос в том, чем эти атрибуты должны отличаться.
Igor
Или его только в месте использования можно?
оно по-моему только на параметры функций вешается
Constantine
Я не понимаю зачем подсказки когда компилятор видит все поведение программы
Иван
Halting problem?)
Constantine
Не аргумент. Тогда формальные доказательства над концептами впиливайте)
Igor
Я не понимаю зачем подсказки когда компилятор видит все поведение программы
struct GLMatrixStacker { GLMatrixStacker() { glPushMatrix(); } ~GLMatrixStacker() { glPopMatrix(); } }; при создании переменной будет ругаться, что "создаётся неиспользуемая переменная с потенциальными сайдэффектами"
Igor
хотя она используется за счёт именно своего создания
Igor
а если видит - вот тогда да, утраиваю вслед за Владиславом
Constantine
Лучше придумайте синтаксис неполиморфных указателей и ссылок)
Constantine
Мне кажется что проявление виртуальных функций даст намного больше пространства оптимизации
Ramazan
На Си как можно написать такие строки ? vector < vector <double> > arr(m); arr.resize(n); cout << endl; cout << setprecision(4) << setw(13) << scientific;
Vladislav
только не скомпилируется
Ramazan
Какой-то тест с собеседования?
Нет, из общего кода непонятные моменты
Aleksander
портируешь на Це?
Constantine
только не скомпилируется
в комментарии скомплиируется
Vladislav
сам топи урановые ломы в ртути
Ramazan
А если с++ инициализировать и декопмпилить в ИДА ? ))
Constantine
ида еще жива?)
Ramazan
Мммм, а как думаешь, где реверсится все и вся?)
Constantine
А ида умеет в 64?
Constantine
Мммм, а как думаешь, где реверсится все и вся?)
Я примерно со второго курса не занимался этими вопросами)
Constantine
Хотя нет, вру, в одной игрушке патчил CreateFont(ANSI_CODEPAGE, ...) на CreateFont(DEFAULT_CODEPAGE, ...) чтобы можно было русификацию делать, обезьяны блин
Ramazan
Ida+hexrays , она ещё и поддерживается активно по сей день
Constantine
ну ладно, пойду дробный переход напишу, чтобы отлаживать веселее было
Ramazan
Ну а мне как написить эти сиппшные строки в сишные?)
Constantine
брать мануал и там malloc, realloc, free, printf
Igor
На Си как можно написать такие строки ? vector < vector <double> > arr(m); arr.resize(n); cout << endl; cout << setprecision(4) << setw(13) << scientific;
вторая строка навевает сильные подозрения, что там должно было быть for (size_t i=0; i<m; ++i) arr[i].resize(n);
Constantine
Igor
разве что она совершенно выдернута из контекста и инициализации матрицы там не предполагалось
Igor
ну тогда это же пишется vector<vector<double>> arr(m, vector<double>(n));
...оядебил, никогда не задумывался о втором параметре в этом случае >< спасибо тебе, добрый человек
Andrey
Кто-нибудь подскажет по какой причине может вылетать ошибка "corrupted size vs. prev_size:" в строке "fseek(fp, 0L, SEEK_END);" при этом файл успешно открыт для чтения.