Код: Выделить всё
void add(int& hw, int& lw, int x)
{
int sum = lw + x; // <--- lw = INT_MAX + x = 42 => бум..
Код: Выделить всё
void add(int& hw, int& lw, int x)
{
int sum = lw + x; // <--- lw = INT_MAX + x = 42 => бум..
За быстрее - надо проверять. За короче - это не всегда достоинство, да и с "проще" тоже штука такая...SaaBaka писал(а):Мой вариант короче, проще и быстрее :)
Я в курсе. Именно это и не нравится. Для одиночной разработки ещё куда ни шло, для командной - очень плохо, приходится каждый раз через дебри прорываться.SaaBaka писал(а):Ega23
C++ - это что называется craftsman language. Можно очень многое, но нужно чрезвычайно хорошо понимать, что делаешь.
Иногда даже понимание не спасает. Мы очень намучились с подобными кодами, когда переходили с одной архитектуры процессора на другую, а потом с 32 на 64 бита. Потому что было нарисовано очень много кода, построенного на предположениях о том, какие размеры типов, и куда придется указатель и как именно "behavior undefined", да. А ведь можно было и не "оптимизировать", и сократить время (=деньги) на техподдержку, миграцию и дальнейшую разработку. Компилятор ведь очень не дурак, если ему попроще обьяснить что нужно сделать - он и сам оптимизирует враз.SaaBaka писал(а):<..> для С++ такое вполне допустимо. <..> Можно очень многое, но нужно чрезвычайно хорошо понимать, что делаешь.
Это просто кривой код, оптимизация тут не при чем. Любой кроссплатформенный разработчик знает, что длина/репрезентация/выравнивание типов и endianness могут быть разными.Потому что было нарисовано очень много кода, построенного на предположениях о том, какие размеры типов, и куда придется указатель и как именно "behavior undefined", да.
Ну да. Что касается твоего примера - решение "в лоб" (обычный цикл + использование слова большей ширины для суммы) позволяет компилятору еще и автовекторизацию использовать.Компилятор ведь очень не дурак, если ему попроще обьяснить что нужно сделать - он и сам оптимизирует враз.
Это не интересно. Коммерчески - оправдано. Но не интересно.SaaBaka писал(а):Что касается твоего примера - решение "в лоб" (обычный цикл + использование слова большей ширины для суммы) позволяет компилятору еще и автовекторизацию использовать.
Это было про возвращаемые типы данных, или про оптимизацию?SaaBaka писал(а):Обычно - да. И это зависит больше от культуры, чем от языка реализации. На обычном джаваскрипте можно нараз такое написать, что хрен поймешь потом вообще.
Это как именно, через "typedef int Foo1_Exit_Code", или через энумераторы/обьекты? Если первое, то может они предполагают подмену типа на этапе компиляции для каждой платформы, которую они собираются поддерживать.. А если возвращаемый код это обьект класса Foo1_Exit_Code, тогда это попытка сделать строгую проверку типов для всех сущностей системы, включая возвращаемые значения. Можно сделать и через обычные энумераторы, но они много от чего страдают. Вылечено через enum class в C++11. "Теперь это - норма!" (с) МалышеваEga23 писал(а):Заведение типов Foo1_Exit_Code и Foo2_Exit_Code - это общий стиль всех си-программеров, или просто мне так не везло в жизни?
Отдаваемый объект из DLL - очень плохой тон и чревато опасностями. В библиотеки и приложении могут быть разные менеджеры памяти, может быть разная метода учета счетчиков ссылок для magic-классов и т.п.LuckyOne [away] писал(а):Это как именно, через "typedef int Foo1_Exit_Code", или через энумераторы/обьекты?
сырцы - сырцами. Но если надо строку вернуть из библиотеки, то ты же не class string возвращаешь, а указатель на буфер + длину строки. Иначе разврат и коррупция получатся.LuckyOne [away] писал(а):ЗЫ: А, не, вроде не туплю. "есть исходник" - это сырцы, а не бинарник. Тады всё как выше в посте изложено.
Долго думал. В голом си нету класса стринг, там да - адрес и длину, без вариантов. В плюсах возвращаю обьекты класса стринг, или, что чаще, const ref на оные, если в классе зашиты и пользователю их менять не треба. С более сложным функционалом так и вообще никак без отдачи обьектов. А иначе ведь и смысла в ентом обьектно-ориентированном дезигне нету.Ega23 писал(а):.. если надо строку вернуть из библиотеки, то ты же не class string возвращаешь, а указатель на буфер + длину строки. Иначе разврат и коррупция получатся.
..и с подсознанием OpenCL или там OpenMP, так? :)dbalka писал(а):мне требуется программист с сознанием CUDA (и зачем))
Есть массив INT. Нужно перевернуть его (задом наперёд). Буферные переменные использовать низя..WingRabbit писал(а):Давайте еще алгоритмы пощелкаем, а?