Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
По просьбам зрителей, да и что то у меня накопилось. Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет. ///1 Пример первый - есть структурка - в которой перемешаны int16_t и int32_t, компилятор 32-битный. Структурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию. Так вот, структурка до 98 байт - не выравнивается, т.е ее размер соответствует сумме мемберов. А вот на 98байте компилятору ну просто очень нужно выровнять на оффсет 4. Я конечно понимаю, что он ничего не должен, но ожидаю предсказуемого поведения в сходных случаях. ///2 Окай, я такой значит уже умный - вставляю __attribute__ ((__packed__)) и вроде счастлив. Авотмуй! ///2.1 Во первых, есть такой баг, мало того что плавающий (не всегда проявляется), а еще и мигрирующий между версиями. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 Т.е даже пример из документации https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes может просто не работать! ///2.2 Целая песня, если у вас вложенные структуры, юнионы и смесь. Не надо думать, что вы написали __attribute__ ((__packed__)), и всё - с несанкционированными выравниваниями покончено. Работа этого аттрибута вполне зависит от погоды, наличия имени структуры, наличия typedef и положения аттрибута относительно порядка имя-аттрибут. ///3 Отдельная тема - качество и понятность генерируемого ассемблера, а за компанию и работа гнусного дизассемблера, которые не попадает в адреса относительно кода. ///4 Который раз твердили миру, -О3 не работает уже 10 лет. Если ваша программа крашится, нужно откатиться на -О2, а лучше и не пробовать. Последний раз - мы тут на форуме гоняли рейтрейсинг, живой пример. ///5 Из мелких придирок - отвратительно медленный старт под Windows всего гнусного тулчейна, жручесть памяти и скорость работы компилятора. Сходу всё не вспоминается, потом продолжу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 14:19 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
хм о баге с выравниваниванием я знал, но он мне не так сильно докучает.. вы часто пользуетесь этой фичей что ли? на счет непопадания в адреса - иногда бывает :) это прикольно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 14:42 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
сюда же можно отнести качество кода stl наверное :) если попытаться понять что там,то там вообще неразбериха. часто несколько операторов в одной строке, и, если ты попадаешь туда под отладчиком, приходится выполнять их все за раз, что досадно, если нужно войти в какую-то функцию - заходишь сначала во все потроха, а потом куда надо. намешаны пробелы и табы, underscore и camel cale ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 15:20 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Никогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем??? Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат. Типа заголовка ethernet/tcp/udp пакетов. Но они маааааленькие. Никак не вылазят за такие большие объемы. Во всех остальных случаях удобнее делать полноценную сериализацию. Медленный старт? Где? Почему-то в моих тестах, VC намного медленнее... Впрочем, VC я обычно использую только если нету другого выхода и делаю это почти всегда из-под VS а GCC у меня запускается из makefile'ов всегда. Если вы не любите gcc, вы просто не умеете его готовить. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 17:34 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
-О2 в продакшене использовать нельзя. -О3 - а это что такое?? Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен. White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат. Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 18:52 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
White OwlНикогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем??? :) встречал такое что одни и те же структуры используются программами на разных языках программирования (COBOL и С, например) в таких случаях без паковки не обойтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2016, 01:38 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Новый Год, тогда можно прокси сделать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2016, 11:48 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Как я уже написал, невыровненные структурки нужны для обмена по чужому ABI. Еще пару вещей вспомнил - Red zone. Коснется вас если только вы используете ассемблер (ну или ловите баги порчи стека) - укуренное использование. Т.е ваш стековый массив может краешком лежать в редзоне. Временные переменные, даже не ваши временные, а которые потребовались при оптимизации - тоже. Почему не размещаться с начала по порядку - хз. Возможно используется по порядку с конца. - С99 в исполнении gcc обязывает вас все inine функции переписать как static inline, иначе будет ошибка линковки. Static inline это навязано стандартом, но реализация могла бы и упростить.... Я теперь знаю про extern inline, но в любом случае это жутко неудобно и несовместимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2016, 14:39 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglПо просьбам зрителей, да и что то у меня накопилось. Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет. ///1 Пример первый - ........ . Siemargl, а можно ссылочку на ваши программы созданные на С++ и gcc? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2016, 15:51 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
locked-О2 в продакшене использовать нельзя. -О3 - а это что такое?? . У меня как-то и -O2 работает, и -O3 работает... Не, конечно, багов нет только в коде божественного Виндуоза, это понятно, но всё же -- не так GCC и плох... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2016, 17:49 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
В одной программе случилось так, что в разных .cpp-файлах есть 2 класса с одинаковыми именами: 1.cpp Код: plaintext 1. 2. 3. 4. 5. 2.cpp Код: plaintext 1. 2. 3. 4. 5. Не copy-paste, классы разные. То есть это было нарушение ODR (one definition rule), но компиляторы C++ к сожалению не обязаны обнаруживать нарушения ODR. Один класс реально использовался, другой -- нет, просто остался как хлам. Оба класса были с виртуальными методами. Соответственно, для обоих классов генерировались vtable-ы с одинаковыми link-овочными именами (что-нибудь типа _message_box_t_vtable, зависит от компилятора). Но из всех одноимённых vtable-ов в финальном бинарнике должен остаться только один. До поры до времени был Visual C++, его linker протаскивал в финальный бинарник vtable нужного класса, и всё работало нормально. Потом был GCC, его linker протаскивал в финальный бинарник vtable ненужного класса, поэтому нужный класс жил с чужим vtable-ом (своего тёзки). Это естественно глючило, так проблема и обнаружилась, ненужный класс был убран, и всё заработало. То есть в данной ситуации Visual-овский linker оказался то ли умнее, то ли просто удачливее, чем GCC-шный linker. Короче, бойтесь нарушения ODR. Или переходите на более современный язык, который не позволит в одном namespace-е иметь 2 класса с одинаковыми именами :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 01:53 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются. Побочный эффект - если у вас объектник указан до использующего его функции другого, получишь ошибку линковки. Особенно доставляет, если есть циклические зависимости. Раньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах. Б) Сразу добавлю в темку - после смены версии вырос размер исполняемого файла. Для обычного helloworld для проверки - в 6 раз. Посмотрел в .map - ОМГ сколько мусора, и фиг разберешься что зачем. Справедливости ради, то если разберешься, то можно ручками сделать скрипт линкера с отбрасыванием чего тебе ненужного, вроде размотки стека исключений для .c программ (я еще не разобрался) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 11:13 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglРаньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах.С vtable-ами дублирование иногда неизбежно. Если например есть исходники: message_box.h Код: plaintext 1. 2. 3. 4. 5. 1.cpp Код: plaintext 1. 2. 2.cpp Код: plaintext 1. 2. 3.cpp Код: plaintext 1. 2. то vtable класса message_box_t будет во всех 3-ёх файлах (1.o, 2.o, 3.o для GCC; 1.obj, 2.obj, 3.obj для Visual C++). Linker протащит в финальный бинарник только один vtable. Но в данном случае всё нормально, потому что нет нарушения ODR. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2016, 14:39 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
А какой другой вы тогда посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2016, 00:04 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG +2 std::thread в сборке i686-6.2.0-win32-sjlj-rt_v5-rev1 отсутствует а в сборке i686-6.2.0-posix-dwarf-rt_v5-rev1 работает через жо - thread.join() не гарантирует ожидания конца, как обязана ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 01:09 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
В архитектуре x32 не использует AVX, хотя ему явно сказано >-m32 -O2 -march=core-avx2 -mtune=core-avx2 Похоже, что работа ведется только для x86-64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 01:26 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglВ архитектуре x32 не использует AVX, хотя ему явно сказано >-m32 -O2 -march=core-avx2 -mtune=core-avx2 Похоже, что работа ведется только для x86-64 Не совсем так. Просто надо ручками дополнительно писать -mfpmath=sse ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 02:20 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG У МС тоже, но NDEBUG автоматом добавлен в дефайны релиза Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 07:14 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 09:29 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglЭто мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет. . Ты имеешь в виду GCC в режиме C, или G++ ( C++ компилятор) , или оба ? Уточни, пожалуйста. Siemargl///4 Который раз твердили миру, -О3 не работает уже 10 лет. Если ваша программа крашится, нужно откатиться на -О2, а лучше и не пробовать. Последний раз - мы тут на форуме гоняли рейтрейсинг, живой пример. У меня работает -O3 на моём проекте, вполне всё ОК. Четыре года назад я работал на GCC на проекте на чистом C, с -O3 всё также работало адекватно. К тому же, -O3 -- комплекный параметр, он включает, как я понимаю, несколько оптимизаций, и, если что-то и не работает, надо говорить о каждой отдельно, а не о всём вместе. О проблемах Win-версии лучше всего писать основному мейнтейнеру , niXman-у, сюда http://www.rsdn.org/account/info/75665 И да, GCC -- не самый быстрый в мире компилятор, а fork на винде работает долго... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 12:37 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglПётр Седов, А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются. Так любой линкер так и должен работать! То, что ты нарушаешь ODR -- это ТВОИ проблемы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 12:52 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG Родной , так И НЕ ДОЛЖНЫ ОНИ УДАЛЯТЬСЯ без NDEBUG. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 12:53 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
SiemarglСтруктурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию. Так вот, структурка до 98 байт - не выравнивается, т.е ее размер соответствует сумме мемберов. А вот на 98байте компилятору ну просто очень нужно выровнять на оффсет 4. Я конечно понимаю, что он ничего не должен, но ожидаю предсказуемого поведения в сходных случаях. как все печально-то... по правде говоря существует гласное ABI правило - ничего сложнее ordinal типов (максимум 8 байт) не передавать, особенно чужим функциям. и функции с больше чем 3-мя параметрами уже страшное зло (их невозможно протестировать - слишком много вариантов получается в матрице тестовых значений). уже на 16 байтах начинаются чудеса с вовлечением XMM регистров и прочей несовместимости. а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 13:13 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovSiemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки???Да, и вправду, похоже меня IDE разбаловали, которые сами добавляют. MasterZivSiemarglПётр Седов, А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются. Так любой линкер так и должен работать! То, что ты нарушаешь ODR -- это ТВОИ проблемы!Ну не так - он должен выругаться об неоднозначности, а не линковать что первое попало. dbpatch..бред про ХММ убран... ...а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.Я и передаю по указателю. Какая разница, если выравнивание навернуто. Так так, похоже про thread.join() я соврал - у меня было больше потоков, чем я думал - корректно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 18:11 |
|
||
|
Как я люблю gcc
|
|||
|---|---|---|---|
|
#18+
locked-О2 в продакшене использовать нельзя. -О3 - а это что такое?? Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен. White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат. Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс. Почему нельзя использовать -O2 кто-нибудь скажет? Кроме того, что дебажить неудобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 18:12 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=18&tid=2017801]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
89ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 190ms |

| 0 / 0 |
