powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как я люблю gcc
25 сообщений из 66, страница 1 из 3
Как я люблю gcc
    #39321055
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По просьбам зрителей, да и что то у меня накопилось.

Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет.

///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 всего гнусного тулчейна, жручесть памяти и скорость работы компилятора.

Сходу всё не вспоминается, потом продолжу.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321076
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм о баге с выравниваниванием я знал, но он мне не так сильно докучает..
вы часто пользуетесь этой фичей что ли?

на счет непопадания в адреса - иногда бывает :) это прикольно.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321118
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сюда же можно отнести качество кода stl наверное :)
если попытаться понять что там,то там вообще неразбериха. часто несколько операторов в одной строке, и, если ты попадаешь туда под отладчиком, приходится выполнять их все за раз, что досадно, если нужно войти в какую-то функцию - заходишь сначала во все потроха, а потом куда надо.
намешаны пробелы и табы, underscore и camel cale
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321260
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем??? Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат. Типа заголовка ethernet/tcp/udp пакетов. Но они маааааленькие. Никак не вылазят за такие большие объемы.
Во всех остальных случаях удобнее делать полноценную сериализацию.

Медленный старт? Где? Почему-то в моих тестах, VC намного медленнее... Впрочем, VC я обычно использую только если нету другого выхода и делаю это почти всегда из-под VS а GCC у меня запускается из makefile'ов всегда.



Если вы не любите gcc, вы просто не умеете его готовить.
:)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321322
locked
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-О2 в продакшене использовать нельзя.
-О3 - а это что такое??

Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен.

White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат.
Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321489
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНикогда не понимал нужды паковать гигантские структуры. Два-три поля упаковать прикола ради - ну нехай будет. Но заниматься паковкой структур постоянно... зачем???
:)

встречал такое что одни и те же структуры используются программами на разных языках программирования
(COBOL и С, например)
в таких случаях без паковки не обойтись
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321762
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Год,

тогда можно прокси сделать..
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39321972
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я уже написал, невыровненные структурки нужны для обмена по чужому ABI.

Еще пару вещей вспомнил

- Red zone. Коснется вас если только вы используете ассемблер (ну или ловите баги порчи стека) - укуренное использование. Т.е ваш стековый массив может краешком лежать в редзоне. Временные переменные, даже не ваши временные, а которые потребовались при оптимизации - тоже. Почему не размещаться с начала по порядку - хз. Возможно используется по порядку с конца.

- С99 в исполнении gcc обязывает вас все inine функции переписать как static inline, иначе будет ошибка линковки. Static inline это навязано стандартом, но реализация могла бы и упростить.... Я теперь знаю про extern inline, но в любом случае это жутко неудобно и несовместимо.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39322053
_Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglПо просьбам зрителей, да и что то у меня накопилось.

Это мерзкое недоделанное кривое поделие, с которым приходится работать, т.к местами кроме него ничего нет.

///1
Пример первый -
........
.

Siemargl, а можно ссылочку на ваши программы созданные на С++ и gcc?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39322208
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locked-О2 в продакшене использовать нельзя.
-О3 - а это что такое?? .

У меня как-то и -O2 работает, и -O3 работает...
Не, конечно, багов нет только в коде божественного Виндуоза, это понятно, но всё же -- не так GCC и плох...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331139
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одной программе случилось так, что в разных .cpp-файлах есть 2 класса с одинаковыми именами:
1.cpp
Код: plaintext
1.
2.
3.
4.
5.
...
class message_box_t {
  ...
};
...

2.cpp
Код: plaintext
1.
2.
3.
4.
5.
...
class message_box_t {
  ...
};
...

Не 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 класса с одинаковыми именами :).
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331324
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.

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

Раньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах.


Б) Сразу добавлю в темку - после смены версии вырос размер исполняемого файла. Для обычного helloworld для проверки - в 6 раз.
Посмотрел в .map - ОМГ сколько мусора, и фиг разберешься что зачем.

Справедливости ради, то если разберешься, то можно ручками сделать скрипт линкера с отбрасыванием чего тебе ненужного, вроде размотки стека исключений для .c программ (я еще не разобрался)
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39331599
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglРаньше вроде MS-линкер обнаруживал дублирование и ругался, может дело в классах.С vtable-ами дублирование иногда неизбежно. Если например есть исходники:
message_box.h
Код: plaintext
1.
2.
3.
4.
5.
class message_box_t {
  ...
  virtual void timeout() {}
  ...
};

1.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

2.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

3.cpp
Код: plaintext
1.
2.
#include "message_box.h"
...

то vtable класса message_box_t будет во всех 3-ёх файлах (1.o, 2.o, 3.o для GCC; 1.obj, 2.obj, 3.obj для Visual C++). Linker протащит в финальный бинарник только один vtable. Но в данном случае всё нормально, потому что нет нарушения ODR.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39345982
Касалапый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какой другой вы тогда посоветуете?
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382802
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+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() не гарантирует ожидания конца, как обязана
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382810
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В архитектуре x32 не использует AVX, хотя ему явно сказано
>-m32 -O2 -march=core-avx2 -mtune=core-avx2

Похоже, что работа ведется только для x86-64
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382819
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglВ архитектуре x32 не использует AVX, хотя ему явно сказано
>-m32 -O2 -march=core-avx2 -mtune=core-avx2

Похоже, что работа ведется только для x86-64
Не совсем так. Просто надо ручками дополнительно писать -mfpmath=sse
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382845
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG
У МС тоже, но NDEBUG автоматом добавлен в дефайны релиза
Код: plaintext
1.
2.
3.
4.
5.
// assert.h
#ifdef NDEBUG
    #define assert(expression) ((void)0)
#else
...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39382884
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки???
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383042
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 на винде работает долго...
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383066
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.

Так любой линкер так и должен работать!
То, что ты нарушаешь ODR -- это ТВОИ проблемы!
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383068
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUG


Родной , так И НЕ ДОЛЖНЫ ОНИ УДАЛЯТЬСЯ без NDEBUG.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383092
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСтруктурка передается параметром чужим функциям и соответственно, чувствительна к выравниванию.
Так вот, структурка до 98 байт - не выравнивается, т.е ее размер соответствует сумме мемберов. А вот на 98байте компилятору ну просто очень нужно выровнять на оффсет 4.
Я конечно понимаю, что он ничего не должен, но ожидаю предсказуемого поведения в сходных случаях.
как все печально-то...

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

уже на 16 байтах начинаются чудеса с вовлечением XMM регистров и прочей несовместимости.

а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383458
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSiemargl+1 assert'ы не удаляются в релизной сборке без явно указанного NDEBUGНе очень, правда, понятно почему вас это удивляет и почему макрос препроцессора должен зависеть от типа сборки???Да, и вправду, похоже меня IDE разбаловали, которые сами добавляют.
MasterZivSiemarglПётр Седов,

А)Подтверждаю, это еще одна "фича" gcc - ld - просто берется первая функция с нужным именем по порядку объектников в командной строке линкера, остальные не проверяются.
Так любой линкер так и должен работать!
То, что ты нарушаешь ODR -- это ТВОИ проблемы!Ну не так - он должен выругаться об неоднозначности, а не линковать что первое попало.
dbpatch..бред про ХММ убран...
...а тут ты передаешь over 98 байт, и спрашивается в задаче, кто ССЗБ ? Будь как все, передавай указатель на свою копию в стеке, конечный эффект будет такой-же.Я и передаю по указателю. Какая разница, если выравнивание навернуто.

Так так, похоже про thread.join() я соврал - у меня было больше потоков, чем я думал - корректно работает.
...
Рейтинг: 0 / 0
Как я люблю gcc
    #39383461
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locked-О2 в продакшене использовать нельзя.
-О3 - а это что такое??

Если хочется использовать -О2 можно купить самую простую версию интеловского компайлера. Одну лицензию и поставить ее на билд-бокс. Особенно если результат идет в продакшен.

White Owl....Единственный случай когда удобно иметь упакованную структуру это если ты ее собираешься по сети кидать и это заранее известный формат.
Ну или файл(ы) данных за-mmap-лен(ы). А для сети можно сделать сериализацию. Ибо может влиять енднесс.
Почему нельзя использовать -O2 кто-нибудь скажет? Кроме того, что дебажить неудобно.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как я люблю gcc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]