Constantine
Arseny
operator+ видимо
Arseny
v3 можно не вычислять целиком.
Constantine
я просто хочу понять, какой код в итоге вы хотите увидеть и насколько быстрее он будет работать
Matway
Constantine
с точки зрения С++ это не эквивалентный код
Berkus
типа a3 = dynamicFloat() + dynamicFloat() + dynamicFloat();
Berkus
эквивалентный, посмотри на expression templates еще раз
Matway
Constantine
нет, не эквивалентный! а если строка 9 вызывает crash (stack overflow)?
Matway
Constantine
хотя это шутка, но на самом-то деле суть примерно в этом
Constantine
и потом, ничего не мешает сделать
auto v3 = v0 + v1;
v3 += v2;
Constantine
хотя последнее очень неприятно
Berkus
оно примерно так и делает на уровне SIMD - складывает всё кусками
Constantine
емнип совпадение source и destination операции вызывает небольшой ручник процессора
Berkus
для xmm пофигу кажется
Constantine
потом, как я понимаю, на std::vector накладные расходы все на перемещении
Constantine
т.е. их просто нет
Constantine
Constantine
мне неизвестно, что dynamicFloat() не обладает side-effect-ами
Matway
Constantine
опять же, я не очень понимаю, почему это работа компилятора
Constantine
практика показывает, что плохой оптимизатор лучше, чем оптимизатор, сгенерировавший неправильный код)
Constantine
эта оптимизация поломается от любого чиха
Berkus
чего ж она работает во всяких Eigen тогда?
Berkus
дураки писали наверное
Arseny
Arseny
Matway
Может и может, но не делает.
Ну, это уж так написали компилятор. Речь о том, что если сейчас какому-нибудь Intel приспичит оптимизировать подсчёт только нужных значений - они это сделают за пару недель. Сделать же автоматическую дедукцию ET будет намного сложнее.
🐙 Antony
Циклы в строчке 34 должны свернуться в один.
Эту оптимизацию ещё просто не сделали в GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80317 (в clang её ещё тоже не сделали, тикет искать лень, он такой же как в GCC)
Matway
"This would require loop fusion, sth we don't do at the moment. For this particular case dependence analysis should even make it possible."
Constantine
короче если подумать, то у компилятора плюсов вся информация есть
Constantine
вопрос в том, что такой код компилятор оптимизирует хуже
Constantine
чем человек
Matway
Ну, формально есть. По факту - такую оптимизацию делать на данном уровне просто очень дорого.
Constantine
совершенно нет
Constantine
компилятору нужны формальные доказательства, что нет side effect
Constantine
человек может выяснить, что там с dynamicFloat, компилятор в любом случае вынужден сделать вызовы
Constantine
в остальном компилятор может построить такое доказательство достаточно легко
Constantine
ему нужно будет перепроверить, что const на самом деле работает как const
Constantine
что копирования памяти просто так делаются
Constantine
в реальности там вместо С-style массива будет стоять С++, еще и вектор в худшем, так что компилятору придется еще проверять что вектора доказанно на один элемент не указывают
Constantine
и все это учитывая тот факт, что человек может просто в хотпафе такое увидеть и переделать за 5 минут
Constantine
короче, меня пока не убедили
Крылатый
Крылатый
Когда есть возможность обойти const.
Крылатый
И компилю ПРИХОДИТСЯ проверять и верить, что его никто не сломает.
Constantine
void f(int & x, int const& y) {
x += y;
x += y;
}
void g() {
int x = 1;
f(x, x);
}
Constantine
не говоря о случаях, когда просто нельзя не написать const_cast
Constantine
не говоря о случаях, когда надо писать mutable
Constantine
как вообще обойти вот этот пример:
struct CachedComputingEngine: ComputingEngine {
int get() const override { /*суперсложный расчет, который надо кэшировать */ }
mutable bool cached = false;
mutable int cache;
};
Olesya
привет, народ. есть русский текст и английский. надо искать там регулярки. регулярка на вход поступает как string val. текст тоже в string. пробовала icu - не работает с русским текстом - возможно, что-то идёт не так, когда я из string делаю UnicodeString. в общем, кто-нибудь может посоветовать, какими регулярками пользоваться?
Constantine
ну, не считая читов под названием "const не очевиден при нарушении семантики типа"
как вообще обойти вот этот пример:
struct CachedComputingEngine: ComputingEngine {
int get() const override { /*суперсложный расчет, который надо кэшировать */ }
std::unique_ptr<std::unique_ptr<int>> container;
};
Constantine
Constantine
я полагаю, что для std::string еще бы кодировку знать и проверить, что она читается как надо
Olesya
ну для тестирования работы я просто насоздавала строк в коде. через string test("что-нибудь);. перевожу в UnicodeString через c_str(). по идее, там не может быть ничего, кроме UTF-8. разработка на Ubuntu.
Constantine
вы точно уверены, что перекодировка не поломана?
Constantine
UnicodeString это UTF-8, UTF-16 или UCS-2?
Constantine
выведите побайтово строчку
Constantine
до и после
Constantine
и я крайне не уверен, что std::string будет в какой-то кодировке юникода
Dr. Friedrich
Я бы попробовал UnicodeString::fromUTF8().
Dr. Friedrich
Конструктор из const char * явно делает ерунду: http://icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#ae436989ec7fc5a488e48f775cbfae711
> Uses the default converter (and thus depends on the ICU conversion code) unless U_CHARSET_IS_UTF8 is set to 1.
Olesya
Olesya
спасибо, попробую fromUTF8()
Constantine
видимо, в этом вся ваша проблема
Constantine
но я не уверен, что string на самом деле в UTF-8
Constantine
Constantine
слишком долго думать, не написали ли мне U+FEFF первым символом и нет ли кода 0 в файле