Ответить
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 14 марта 2018 01:43

    Mahagam, да как уже писалось выше, оптимизируют все ( и во фришных и коммерческих тулзах) как хотят,со здравым смыслом или пулей в голове - стандарт языка не нарушили - проблемы не на нашей стороне. Оптимизация наука не простая, и еще развивается динамично - кто как понимает тот так и лепит.

    А по поводу коммерческих тулзов vs фришных - палка о двух концах. Если деньги платишь за компилятор и есть суппорт нормальный - можно дрючить вендора (Visual Studio не рассматриваем - там суппорта нет нормального - у мелкософта лозунг один - ешьте что дают). У бесплатных тулзов свои преимущества - ни от кого не зависишь - свобода тоже хорошо (я сам на юниксах/линуксах сижу плотно давно , счастья полные штаны). Мне кажется все дело в деньгах. У нас программер будет 36 штук в год стоить, а в штатах 100 штук. Поэтому у нас компилятор за 50 штук с крутым SLA по суппорту не купят - наймут программера скиластого и gcc. В штатах по деньгам дешевле компилятор с суппортом купить чем крутого программера нанять который в gcc/gdb собаку съел.

    Это я про embedded если что. Для прикладухи что gcc что clang что icc, что vs - все пойдет, пипл хавает.

    НКХЖЕХВ
  • human0id Member
    офлайн
    human0id Member

    487

    18 лет на сайте
    пользователь #74992

    Профиль
    Написать сообщение

    487
    # 14 марта 2018 14:53
    Korben_Dallas:

    Я как-то уже пробовал, в этой самой теме несколько месяцев назад. У некоторых, не считающих себя новичками, почему-то начало дико пригорать. Я до сих пор не понял, почему...

    Попробуйте еще раз, только корону снимите и свет вокруг головы приглушите.

  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 14 марта 2018 19:23 Редактировалось Korben_Dallas, 5 раз(а).
    Mahagam:

    всего лишь -fwrapv -fno-delete-null-pointer-checks и всё работает "как на борланде"

    Но пример с возвратом указателя на локальную переменную "спасти" пока, я смотрю, не удалось :P

    Что интересно, именно эта возможность представляла бы определенную ценность. Возвращать ссылки/указатели на обычные локальные переменные бессмысленно, но в C++17 компиляторах, подчиняющихся требованиям Itanium ABI, вполне можно возвращать указатели/ссылки на параметры функции, ибо в Itanium ABI время жизни этих объектов продлевается до конца полного вызывающего выражения. Это значит, что формально в GCC и Clang поведение вот такого кода вполне определено

    #include <string>
    #include <iostream>

    std::string *foo(std::string s) { return &s; }

    int main()
    {
    std::string *p;
    std::cout << *(p = foo("Hello World!")), std::cout << " " << *p, std::cout << " " << *p << std::endl;
    }

    Однако в GCC все накрывается медным тазом из-за его манеры упорно возвращать нулевой указатель/ссылку (это про том, что GCC честно продлевает время жизни параметра до конца вызывающего выражения, как того и требует Itanium ABI). В Clang, разумеется, все работает.

    Ключа, подавляющего эту манеру GCC возвращать null, я навскидку не нашел.

    Et si tu tombes 7 fois Toujours se relever 8
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4075

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4075
    # 14 марта 2018 21:55
    Korben_Dallas:

    Но пример с возвратом указателя на локальную переменную "спасти" пока, я смотрю, не удалось

    я ещё тогда просто провёл натурный эксперимент. если обьявлять как static char *p = "Hello"; то всё возвращается корректно (указатель на "Hello"), без static - указатель точно ненулевой, потому что выводится фигня, а не "Hello". среда разработки NI LаbWindоws.
    и логика в этом прослеживается.

    что касается вообще C++17, то я сразу вспоминаю шутку 2,718башу на баше, питон 21 см, после первой хапки свободно пишу на перле, после второй — свободно читаю на перле, после третьей — то же, но вслух. до четвертой не доходил — били.
    так вот, я уже с++ перестал читать. я его _уже_ не понимаю. видимо, нет доступа к тем веществам, которые есть у авторов. мне вообще достаточно чистого си.
    ну и не только C, а и иных языков с крайне "примитивным" синтаксисом - Verilog, GLSL. отсюда и растут ноги к требованиям вида "хочу чтобы знаковая переменная переполнялась и язык знал про это". просто потому что мне лично это бывает надо.

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 14 марта 2018 23:00
    Korben_Dallas:

    но в C++17 компиляторах, подчиняющихся требованиям Itanium ABI,

    каким боком ABI к стандарту C++? Любое ABI - штука платформо-зависимая, на то оно и ABI. Для других платформ можно в ABI тоже найти парочку чудес. Но это все непереносимо.

    Mahagam:

    так вот, я уже с++ перестал читать. я его _уже_ не понимаю. видимо, нет доступа к тем веществам, которые есть у авторов. мне вообще достаточно чистого си.

    С самого начала было понятно что Страуструп знатный тролль :) Думаю правильнее было сразу сделать новый язык. Но не судьба.

    НКХЖЕХВ
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4075

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4075
    # 14 марта 2018 23:15
    gooblin:

    С самого начала было понятно что Страуструп знатный тролль

    первую редакцию крестов я даже пытался осилить не только для чтения, но и на запись. сейчас кресты стал малоотличим от брейнфака

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 14 марта 2018 23:25 Редактировалось Неизвестный кот, 2 раз(а).
    Mahagam:

    первую редакцию крестов я даже пытался осилить не только для чтения, но и на запись. сейчас кресты стал малоотличим от брейнфака

    Осилить можно все, если задаться целью. Просто изначально был выбран говноспособ для расширения языка C фичами, которые чужие ему по архитектуре, потом много лет пытались привести все эти костыли в божеский вид, но легаси тянет назад все равно.

    Если уже ввели new и delete, ну так выкинули бы сразу указатели (явную работу с памятью), а то и бублик съесть и на велосипеде покататься. Если есть шаблоны, препроцессор будьте добры выкиньте - он не нужен. И это только что сразу в голову пришло.

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 15 марта 2018 00:27 Редактировалось Korben_Dallas, 10 раз(а).
    gooblin:

    Korben_Dallas:

    но в C++17 компиляторах, подчиняющихся требованиям Itanium ABI,

    каким боком ABI к стандарту C++? Любое ABI - штука платформо-зависимая, на то оно и ABI. Для других платформ можно в ABI тоже найти парочку чудес. Но это все непереносимо.

    Да, но ABI не должно нарушать стандарт языка. Однако в данном случае все получилось наоборот. И стандарты все-таки не в вакууме пишутся.

    Стандарт С++ вплоть до С++14 требовал, чтобы параметры функций уничтожались в контексте вызывающего года сразу после возврата из функции (С++14 5.2.2/4: "The lifetime of a parameter ends when the function in which it is defined returns. The initialization and destruction of each parameter occurs within the context of the calling function." )

    А авторы Itanium ABI настояли на том, что параметры функций должны продолжать жить до конца полного выражения, содержащего вызов функции (это якобы предоставляет ряд полезных оптимизационных возможностей). Компиляторы юниксового толка (GCC, Clang) поклялись в верности Itanium ABI и стали откладывать момент уничтожения параметров до конца полного выражения. Тем самым они нарушали требования стандарта С++.

    Это привело к появлению C++ Defect Report 1880 (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1880) в стиле "чё теперь делать-то будем?"

    В конечном итоге "прогнулся" стандарт С++ и начиная с С++17 вышепроцитированный текст был заменен на "It is implementation-defined
    whether the lifetime of a parameter ends when the function in which it is defined returns or at the end of the enclosing full-expression."

    В компиляторах GCC и Clang это "implementation-defined" определяется именно Itanium ABI. В этих компиляторах нет никакого UB в возвращении ссылок/указателей на параметры функции, пока эти ссылки/указатели используются в течение времени жизни объекта (т.е. до конца полного вызывающего выражения, как в приведенном мною примере). Но в GCC до сих пор болтается пережиток прошлого - он в таких случаях нагло подставляет возврат нулевой ссылки/указателя, что и демонстрируется моим примером.

    Добавлено спустя 21 минута 51 секунда

    Mahagam:

    я ещё тогда просто провёл натурный эксперимент. если обьявлять как static char *p = "Hello"; то всё возвращается корректно (указатель на "Hello"), без static - указатель точно ненулевой, потому что выводится фигня, а не "Hello". среда разработки NI LаbWindоws.
    и логика в этом прослеживается.

    Ну это ж совсем другое. Ваш `static` тут вообще ни на что не влияет. А сам строковый литерал в С и С++ является и всегда являлся массивом со статическим классом памяти. То есть никакого возврата указателей на локальные данные тут нет и к исходной теме это никак не относится. Ключевым моментом моего примера являлся именно локальный массив.

    Et si tu tombes 7 fois Toujours se relever 8
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4075

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4075
    # 15 марта 2018 01:14

    Korben_Dallas, перепроверил: сделано было через char p[] = "hello". варианты static или const - возвращают указатель на hello. в противном случае возвращается ненулевой указатель по которому hello уже нет.

    To a C programmer strong typing means pressing the keys harder
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 15 марта 2018 01:38 Редактировалось Korben_Dallas, 9 раз(а).
    Mahagam:

    Korben_Dallas, перепроверил: сделано было через char p[] = "hello". варианты static или const - возвращают указатель на hello. в противном случае возвращается ненулевой указатель по которому hello уже нет.

    Вы смешиваете в кучу разные вещи.

    Если в таком случае указан `static`, то `p` не является локальной переменной и никакого UB нет. Но в таком случае любой уважающий себя компилятор заведет отдельный массив `p` и вернет указатель именно на начало массива `p` (проинициализированного строкой "Hello"), а не на начало самого строкового литерала "Hello". (Понятно, что разница между ними чисто концептуальна.) Ибо в противном случае может получиться так, что линкер потом сольет все одинаковые строковые литералы в один и у нас вдруг получится указательное равенство `foo() == "Hello"`. А это грубое нарушение стандарта языка. И в С, и в С++ каждый живой именованный объект обязан иметь уникальный адрес, отличный от адресов других объектов (именованных или нет).

    Если же вы уберете `static`, но добавите `const`, то получится локальная переменная с UB. Тут и говорить не о чем: что бы компилятор тут ни нагенерировал - все будет "правильным".

    Et si tu tombes 7 fois Toujours se relever 8
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4075

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4075
    # 15 марта 2018 12:09
    Korben_Dallas:

    Если в таком случае указан `static`, то `p` не является локальной переменной и никакого UB нет

    а мне чот кажется что она останется локальной, просто будет иметь static storage duration

    Korben_Dallas:

    Если же вы уберете `static`, но добавите `const`, то получится локальная переменная с UB.

    получится переменная указывающая на объект, который гарантированно не будет на стеке. и компилятору намудрить с UB тут крайне сложно.

    To a C programmer strong typing means pressing the keys harder
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 15 марта 2018 16:26 Редактировалось Korben_Dallas, 6 раз(а).
    Mahagam:

    Korben_Dallas:

    Если в таком случае указан `static`, то `p` не является локальной переменной и никакого UB нет

    а мне чот кажется что она останется локальной, просто будет иметь static storage duration

    Верно, но это будет не более чем флудом о полуформальной терминологии. Локальными переменными в С обычно называются переменные с automatic storage duration.

    В любом случае, суть не меняется: если указан `static`, то `p` то никакого UB нет. Так что к чему это в рамках рассматриваемого вопроса - не ясно.

    Mahagam:

    Korben_Dallas:

    Если же вы уберете `static`, но добавите `const`, то получится локальная переменная с UB.

    получится переменная указывающая на объект, который гарантированно не будет на стеке. и компилятору намудрить с UB тут крайне сложно.

    С чего бы это вдруг? Кем/чем гарантировано?

    Нет, конечно. Что с const, что без, такой массив будет располагаться именно на стеке. Исключить объект на стеке компилятор может только в рамках оптимизаций, т.е. если ему удастся доказать, что программа не заметит такого исключения. Но это - редкость.

    Et si tu tombes 7 fois Toujours se relever 8
  • alex.skiba Member
    офлайн
    alex.skiba Member

    451

    9 лет на сайте
    пользователь #1545826

    Профиль
    Написать сообщение

    451
    # 20 марта 2018 14:04

    дамы и господа, вы имели счастье увидеть редкое явление - публичную перепалку Программистов Настоящих, ныне вымирающего вида. несмотря на пугающее поведение, они достаточно безобидны, так как ведут затворнический образ жизни в собственных закрытых локациях (офф- и онлайн) и редко появляются в среде обитания Программиста Обычного. так что не беспокойтесь: пока вы не выбрали C в качестве языка программирования, вам нечего бояться случайной встречи с этими несомненно полезными, но ужасающими созданиями.

  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 20 марта 2018 14:06
    alex.skiba:

    дамы и господа, вы имели счастье увидеть редкое явление - публичную перепалку Программистов Настоящих, ныне вымирающего вида. несмотря на пугающее поведение, они достаточно безобидны, так как ведут затворнический образ жизни в собственных закрытых локациях (офф- и онлайн) и редко появляются в среде обитания Программиста Обычного. так что не беспокойтесь: пока вы не выбрали C в качестве языка программирования, вам нечего бояться случайной встречи с этими несомненно полезными, но ужасающими созданиями.

    Да любой программист нормальный немножко мудакер - работа такая.

    НКХЖЕХВ
  • SpiritMoon Senior Member
    офлайн
    SpiritMoon Senior Member

    1267

    11 лет на сайте
    пользователь #775104

    Профиль
    Написать сообщение

    1267
    # 20 марта 2018 14:08
    alex.skiba:

    дамы и господа, вы имели счастье увидеть редкое явление - публичную перепалку Программистов Настоящих, ныне вымирающего вида. несмотря на пугающее поведение, они достаточно безобидны, так как ведут затворнический образ жизни в собственных закрытых локациях (офф- и онлайн) и редко появляются в среде обитания Программиста Обычного. так что не беспокойтесь: пока вы не выбрали C в качестве языка программирования, вам нечего бояться случайной встречи с этими несомненно полезными, но ужасающими созданиями.

    :trollface:

  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4075

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4075
    # 20 марта 2018 15:09
    gooblin:

    Да любой программист нормальный немножко мудакер - работа такая.

    самокритика - это прекрасно :trollface:
    но за всех говорить не надо, хорошо? )))

    а прикольно, что отнесли к Программистам Настоящим. хотя я себя вообще программистом не считаю.

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 20 марта 2018 15:50
    Mahagam:

    самокритика - это прекрасно .

    а я вообще не программист :trollface:

    Корбен? :shuffle: :trollface:

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 27 марта 2018 10:18 Редактировалось Korben_Dallas, 1 раз.
    gooblin:

    Корбен? :shuffle: :trollface:

    А меня вообще нет. Я просто бот, цепь Маркова, автоматически подбирающая цитаты из стандарта языка.

    ---

    (Вспоминается анекдот: "... - Это Вам к гинекологу надо. - А вы тогда кто?!! - А мы тут стены красим."

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Member
    офлайн
    Неизвестный кот Member

    327

    14 лет на сайте
    пользователь #254888

    Профиль

    327
    # 30 марта 2018 10:52

    Доброе утро!
    А не подскажете, есть ли хорошие курсы по Python в Минске?
    Выбор велик, однако, хочется вложить деньги с пользой.

  • olezha_ Senior Member
    офлайн
    olezha_ Senior Member

    1269

    15 лет на сайте
    пользователь #204133

    Профиль
    Написать сообщение

    1269
    # 30 марта 2018 15:17
    Дымов:

    Доброе утро!
    А не подскажете, есть ли хорошие курсы по Python в Минске?
    Выбор велик, однако, хочется вложить деньги с пользой.

    А с какой целью вы деньги вложить хотите? Если устроиться после курсов Python разработчиком, то оставьте деньги при себе, целее будут. Если для себя, полно онлайн курсов на той же курсере.