−16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
MyBeautifulMarvelousStruc funcWithoutReturnStatement(FuckMyLife eatShitAndDie)
{
MyBeautifulMarvelousStruc mbms;
mbms.myLife = eatShitAndDie;
}
int main()
{
...
MyBeautifulMarvelousStruc test = funcWithoutReturnStatement(eatShitAndDie);
...
}
Призываю дядь в крестах шарящих.
Я объявляю функцию, возвращающую некую структуру. В определении не пишу "return". Собираю с MinGW 4.9.2 32bit. Собираю не вручную, подключил компилер в QtCreator-е. Ошибок при компиляции нет. Создаётся структура, поля которой есть неинициализированный хлам (что не удивительно). Вопросы:
* Что возвращает функция без "return" в теле функции?
* Почему это компилится?
* Что читать, чтобы такие вещи знать?
Не буду утверждать, что читал от корки до корки книжку дядюшки Шилдта, пользовался ей как справочник по базовому синтаксису с комментариями. Листал, короче.
Или это разговор не о c++, а о компиляторах c++?
Запостил: PascalOverlord,
27 Января 2017
4e1 27.01.2017 21:44 # +3
потому что компилятор так захотел, ворнинг то он все равно высрал
что возвратит функция даже сам страуструп не сможет сказать, ибо это UB
чтобы компилятор подавился, а не проглотил это говно, можно ему указать -Werror=return-type
PascalOverlord 27.01.2017 21:54 # 0
4e1 27.01.2017 21:59 # 0
guest 04.02.2017 21:52 # +1
Кароче, если че-та не описано четка в стандарте - это UB. На усмотрение разраба компилера/ОС/черта. Бывают случаи, когда пашет на винде годами, и сразу отказывается компилится на линухе ГЦЦ и прочее. Если тебя не интересуют конкретные извраты, а хочется четкой проверки - включаешь флаг компилера "все варнинги = ошибка" (см. инструкцию компилера).
guest 04.02.2017 22:43 # 0
Это имплементейшон дефайнд. А UB - это невалидный код, бессмыслица (например разыменование невалидного указателя).
guest 04.02.2017 22:46 # 0
Это просто баги реализации стандарта в студии или гцц. UB возникает в рантайме, а не во время компиляции.
bormand 28.01.2017 11:35 # +1
Только -Wall -Wextra, только хардкор.
dxd 28.01.2017 11:39 # +2
bormand 28.01.2017 11:46 # 0
Antervis 28.01.2017 12:29 # +3
guestinho 28.01.2017 18:31 # +2
guest 28.01.2017 20:39 # 0
guest 28.01.2017 20:41 # 0
guest 28.01.2017 21:08 # 0
Antervis 29.01.2017 11:26 # −62
huesto 30.01.2017 01:50 # +1
barop 30.01.2017 02:14 # 0
huesto 30.01.2017 02:17 # 0
barop 30.01.2017 02:38 # 0
huesto 30.01.2017 03:15 # +1
barop 30.01.2017 03:41 # 0
roman-kashitsyn 30.01.2017 12:43 # 0
huesto 30.01.2017 14:41 # 0
barop 30.01.2017 16:39 # 0
guestinho 30.01.2017 16:45 # 0
barop 30.01.2017 16:47 # 0
roman-kashitsyn 30.01.2017 16:50 # +2
Ну технически это верно: Qt это не стандартный C++ и требует moc-компилятора.
defecate-plusplus 30.01.2017 17:45 # 0
huesto 30.01.2017 16:59 # 0
В моем комментарии не было. Ты нафантазировал, не вижу смысла это дальше обсуждать.
huesto 30.01.2017 17:05 # 0
barop 27.01.2017 22:05 # +3
Всякий мусор. Зависит от колконвеншена. Это UB, так делать никогда нельзя.
>>Почему это компилится?
Так написано в стандарте
>>Что читать, чтобы такие вещи знать?
Стандарт
defecate-plusplus 28.01.2017 07:25 # +5
Студент, гугли про calling convention (уж про регистры, стек, кучу ты должен в своем возрасте знать), узнай какой используется в выбранном тобой языке (/компиляторе/декларации конкретной функции), поймешь где лежат данные, которые интерпретируются вызывающим как результат интересующей тебя функции - источник мусора можно определить уже с высокой точностью
Потом гугли методы, которыми выбранный тобой компилятор оптимизирует код, особенно кейсы, когда ему подали не очень валидный код (UB) - в этом случае он имеет право вообще часть твоих инструкций выкинуть к ебеням, потому что в них нет смысла, а мусор результата в результате такой оптимизации найти в другом месте, поближе. Даже на говнокоде есть много постов о таких неожиданных оптимизациях.
В итоге же полный и четкий ответ даст ассемблерный листинг твоей программы и конкретно куска, где был вызов. Есть даже инструменты онлайн - gcc.godbolt.org. В любом случае этот мусор вполне детерминирован, т.к. процессор не может сам нагенерить тебе мусор, он слишком бездушный ублюдок, он просто исполняет то, что ему дают.
inkanus-gray 28.01.2017 10:22 # 0
Antervis 28.01.2017 11:38 # +5
- Ага...
- Это неправильный hello world, чтобы написать правильно иди кури стандарт, учи асм и выхлоп компиляторов..."
> В любом случае этот мусор вполне детерминирован
Так можно и в стекфрейм после другого приложения залезть
gost 28.01.2017 13:01 # 0
Э, как?
Antervis 28.01.2017 13:46 # 0
gost 28.01.2017 17:39 # 0
Или я дальтоник и не увидел зелёный?
CHayT 28.01.2017 17:41 # +4
inkanus-gray 28.01.2017 18:21 # +2
Я думал, что такое только в DOS бывает...
bormand 28.01.2017 18:24 # +1
Назвали бы тредами, и никто бы не докопался :)
CHayT 29.01.2017 11:41 # +2
guestinho 28.01.2017 18:25 # +2
guestinho 28.01.2017 18:27 # +1
В самую писечку угадал.
guestinho 28.01.2017 18:23 # +2
1024-- 28.01.2017 21:04 # +1
Было приложение, отработало, ракрылось. Память никто не занулял. Потом приходит второе приложение, садится на тот же стек и не найдя ни мобильного устройства, ни инструкции к туалетной бумаге, начинает смотреть на то, что высрало после себя уже завершившееся приложение.
guest 28.01.2017 21:34 # 0
guest 28.01.2017 22:00 # 0
inkanus-gray 29.01.2017 01:06 # +2
barop 29.01.2017 01:09 # +2
и ось сразу метнулась тушканчиком их всех занулять
guestinho 29.01.2017 01:22 # 0
barop 29.01.2017 01:26 # +1
Memory from the heap is returned back to the system when it is unmap'd or the heap shrinks with sbrk(). At this point pages can be re-used by other processes and when they are re-used they are always zero'd before the process can access it.
Молодец какой!
Руссинович грит и винда не без этого:
"Firstly, the zero page thread runs at the lowest priority and is responsible for zeroing out free pages before moving them to the zeroed page list."
guestinho 29.01.2017 01:34 # +2
Хочу заметить, что память зануляется не после того, как страница возвращается системе, а перед тем, как система отдает страницу процессу.
barop 29.01.2017 01:40 # +2
Во-вторых логично что эта штучка лениво работает: зачем заранее зануляться, если эта память никогда не понадобится?
guestinho 29.01.2017 01:45 # +5
Особенно когда sigkill прилетает.
> Во-вторых
То была ремарка к твоему саркастичному комментарию "и ось сразу метнулась тушканчиком...".
barop 29.01.2017 01:49 # +3
да, аргумент.
>>То была ремарка к твоему саркастичному комментарию
Я уже понял что обос^W^Wзаблуждался.
Antervis 29.01.2017 11:24 # +1
guestinho 29.01.2017 13:44 # +2
bormand 29.01.2017 14:25 # +1
Вот только х.з., есть ли там тред для зануления или зануление будет только во время copy-on-write...
inkanus-gray 30.01.2017 00:12 # 0
roman-kashitsyn 30.01.2017 00:20 # 0
barop 30.01.2017 00:21 # 0
1) сводил к минимуму фрагментацию памяти
2) работал бы ОЧЕ быстро
huesto 30.01.2017 00:42 # 0
barop 30.01.2017 01:33 # +1
например, free не возвращает сразу память системе чтобы не дерагать лишний раз сискол (sbrk или как там оно в линуксе).
Ребят уровня фейсбука и гугла это может не устраивать
Dummy00001 30.01.2017 13:06 # 0
IIRC, во время COW (copy-on-write). смысла мало обнулять физ память которая может быть и не будет использоватся для памяти приложений. на линухе файло-диско-кэш резиновый, и потребляет часто больше памяти чем приложения.
> что у линухи вообще один r/o zero page на всех.
ага. /dev/zero из этой же странички данные и читает. неиссякаемый источник нулей...
barop 30.01.2017 00:20 # 0
WorkingSet это память в RAM, ЕМНИП, а вся вместе называтеся VIRTUAL
1024-- 28.01.2017 21:14 # 0
>> * Что возвращает функция без "return" в теле функции?
>> * Почему это компилится?
> гугли про calling convention
> источник мусора можно определить уже с высокой точностью
А мне кажется, вопрос был не про сорта мусора, а про идеологию; что автору поста как-то пофиг на конкретные байты, в которых, разумеется, что-то несвежее осталось.
* Какого хрена компилятор в языке с якобы строгой типизацией не бугуртит ошибками на такое разгильдяйство?
* Если это компилируется, то какая суть у возвращаемого значения? (JS без return возвращает значение специального типа)
Ну по крайней мере, я бы такие вопросы задал, если бы мне было не лень создавать новый пост.
guest 28.01.2017 21:31 # 0
В доисторические времена эта 'фича', видимо, была запилена для случаев, когда выход из функции недостижим (всегда выходят раньше или какой-нибудь бесконечный цикл).
barop 28.01.2017 22:03 # 0
причем тут типизация?
1024-- 28.01.2017 22:07 # 0
Предвосхищая вопрос "причём тут строгая типизация?", напишу:
Возвращается значение определённого типа, поэтому и строгая типизация.
Иными словами, неявный каст void в произвольный тип - питушня, противоречащая идеологии строгой типизации.
barop 28.01.2017 22:33 # 0
А что там внутри функции делают комплеятор знать не обязан.
А вот что в дефишинеше написано что надо что-то вернуть, а возвращают ничего -- это фейл, но типизация тут не причемю
huesto 28.01.2017 23:19 # −1
Охуенно, форсим поцаны!
roman-kashitsyn 29.01.2017 00:00 # +7
Будешь форсить -- я тебе лицо причемю
guestinho 29.01.2017 00:21 # 0
roman-kashitsyn 29.01.2017 00:39 # 0
barop 29.01.2017 00:44 # 0
defecate-plusplus 29.01.2017 00:52 # −58
guestinho 29.01.2017 13:50 # +3
1024-- 29.01.2017 13:45 # 0
> не причемю
barop 29.01.2017 14:53 # 0
В каком месте там каст?
1024-- 29.01.2017 21:50 # 0
Antervis 29.01.2017 22:03 # 0
huesto 29.01.2017 23:52 # +1
Antervis 30.01.2017 13:20 # −1
Antervis 29.01.2017 11:28 # 0
Жрет кактус, срет ворнингами. Это наследие си просто
bormand 29.01.2017 11:30 # +1
dm_fomenok 27.01.2017 22:47 # −63
guest 28.01.2017 02:18 # 0
Он в своей книге излагает, скорее всего как тётушка
Antervis 28.01.2017 11:33 # +1
dm_fomenok 28.01.2017 14:09 # −8
CHayT 28.01.2017 14:12 # 0
dm_fomenok 28.01.2017 14:48 # −9
guest 28.01.2017 14:52 # 0
inkanus-gray 28.01.2017 14:51 # +1
Кстати, у Watcom'а есть удобная директива #pragma aux, в которой можно явно указать, кто будет выделять память под возвращаемую структуру: вызывающий код или вызываемая функция.
Antervis 28.01.2017 15:10 # 0
inkanus-gray 28.01.2017 16:20 # +4
bormand 28.01.2017 16:22 # 0
Т.е. можно совсем другое соглашение описать - набор регистров и т.п.? Или только немножко подтюнить стандартные?
inkanus-gray 28.01.2017 16:28 # +4
Более того, стандартные соглашения тоже где-то описаны:
Кстати:
The following form of the auxiliary pragma can be used to describe a function that does not return to the
caller.
bormand 28.01.2017 16:30 # 0
Ну это же банальный noreturn...
inkanus-gray 28.01.2017 16:37 # +1
(при использовании «регистровой» версии библиотек)
(при использовании «стековой» версии библиотек)
(не описано; в справке приведено в качестве примера линковки с «чужими» модулями)
dm_fomenok 28.01.2017 16:30 # −12
bormand 28.01.2017 16:32 # 0
dm_fomenok 28.01.2017 18:14 # −63
inkanus-gray 28.01.2017 18:17 # 0
guestinho 28.01.2017 18:17 # −1
dm_fomenok 28.01.2017 18:52 # −1
bormand 28.01.2017 18:17 # 0
guest 28.01.2017 16:33 # 0
Antervis 28.01.2017 17:16 # 0
guestinho 28.01.2017 18:14 # +2
huest 28.01.2017 20:58 # −61
guest 28.01.2017 21:57 # 0
inkanus-gray 29.01.2017 00:16 # 0
Мне нравится. Будем форсить?
guestinho 29.01.2017 00:22 # 0
barop 29.01.2017 00:30 # 0
guestinho 29.01.2017 00:33 # 0
barop 29.01.2017 00:33 # 0
guestinho 29.01.2017 00:35 # 0
inkanus-gray 29.01.2017 00:38 # 0
4 января сего года был коммит.
Ватноком — тёплый, ватный, белый. Проверь.
inkanus-gray 29.01.2017 00:47 # 0
У нас есть реальный шанс зафорсить что-то новое.
defecate-plusplus 29.01.2017 00:48 # +5
Теплый, ламповый, твой *
-----------------------
* Поддержка стандартов C++17 и C11 заблокирована по решению органов государственной власти.
barop 29.01.2017 00:51 # +3
Maintenance time is being implemented to allow for development and testing. The server will be offline during the following hours:
Ночью просто маме телефон нужен..
inkanus-gray 30.01.2017 00:00 # 0
Внезапно:
https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Criticism
The open-source Open Watcom C/C++ contains a "Safer C" library that is considered a nearly conforming implementation.
Т. е. ко-ко-конпелятор C11 не поддерживает, но библиотека на всякий пожарный с C11 совместима.
barop 29.01.2017 00:52 # +1
inkanus-gray 29.01.2017 01:00 # 0
inkanus-gray 28.01.2017 18:14 # +2
guest 28.01.2017 20:47 # −1
huest 29.01.2017 21:20 # −62
Dummy00001 30.01.2017 16:31 # 0
напомнило о старой доброй проблемке (тьюринговских машин): а завершится ли программа, или нет?
guestinho 30.01.2017 16:40 # 0
Dummy00001 30.01.2017 17:52 # 0
с другой стороны, все компилеры поддерживают варнинги для этого. я уже давно без -Wall ничего не компилю. (правда на крестах всегда отключаю -Wreorder потому что это маразм.)
huesto 30.01.2017 18:22 # 0
Dummy00001 30.01.2017 18:39 # 0
bormand 30.01.2017 18:40 # 0
huesto 30.01.2017 18:55 # 0
bormand 30.01.2017 19:00 # 0
huesto 30.01.2017 19:04 # 0
bormand 30.01.2017 19:11 # 0
huesto 30.01.2017 19:13 # 0
> Причем тут время жизни?
> Если бы там были шаредпойнтеры, ничего бы не изменилось.
> Сначала надо создать иосервис и контекст, а потом стрим.
bormand 30.01.2017 19:24 # 0
В этом конкретном примере тебе просто повезло, что всех объектов по одной штуке. Но обычно сокетов много, а иосервис - один на всех. Да и ssl::context реюзабельный. И вот там управление лайфтаймом ссылок уже не так тривиально (кроме, пожалуй, "засуну их все в глобалки, да и хуй с ними").
> ничего бы не изменилось
> сначала надо создать иосервис и контекст, а потом стрим
Если бы там были шаред поинтеры - я бы мог запилить всё это по-отдельности внутри конструктора (или взять уже готовые). Ссылки заставляют меня делать всё это в инициализаторе. Ссылки заставляют меня тащить зависимости в инициализатор (ну кроме совсем-совсем глобальных). У меня нет выбора. Я обязан иметь все необходимые объекты к моменту вызова инициализатора.
Dummy00001 30.01.2017 19:06 # 0
самое простое & straightforward решение - динамика:
или, если жмет, тогда как ты делал + ревью.
bormand 30.01.2017 19:07 # +3
> this->moe = new moe;
Фублядь, фунахуй! Этот код же течёт как сучка весной... Такое я бы на ревью точно не пропустил (хоть у нас и нету исключений, лол).
Dummy00001 30.01.2017 19:14 # 0
PS с другой стороны, запихиваешь это в `bool Bormand::Init()` и все пучком. так или иначе ошибки конструкции/инициализации обрабатываеть надо. я предпочитаю их явно и без исключений получать.
huesto 30.01.2017 19:21 # +1
huesto 30.01.2017 19:24 # 0
huesto 30.01.2017 19:27 # 0
P.s. на крестах не пишу
huesto 30.01.2017 19:33 # 0
huesto 30.01.2017 19:43 # 0
Какой тогда выход?
1) не использовать new
2) не использовать конструкторы
3) на один new одна обертка?
bormand 30.01.2017 19:44 # 0
huesto 30.01.2017 19:51 # 0
bormand 30.01.2017 19:57 # 0
Смартпоинтеры - это вариант 3 (на один new одна обёртка), тащемта.
huesto 30.01.2017 20:01 # 0
huesto 30.01.2017 20:03 # 0
huesto 30.01.2017 20:06 # 0
guest 31.01.2017 00:20 # 0
Antervis 31.01.2017 05:50 # 0
bormand 30.01.2017 19:34 # 0
Как-будто его кто-то позовёт...
huesto 30.01.2017 19:08 # 0
huesto 30.01.2017 19:11 # +1
Dummy00001 30.01.2017 19:18 # +1
я стараюсь делать легкие кторы + bool Init() методы. потому что из ктора значения вернуть нельзя. и не виртуальный он. а с обычным методом инициализации можно делать все что хочешь.
huesto 30.01.2017 19:30 # 0
roman-kashitsyn 30.01.2017 19:32 # +1
А ты уверен, что понимаешь семантику конструирования объектов? Знаешь, что происходит с первым сконструированным "полем", если конструктор второго "поля" кидает исключение?
Честно говоря, меня очень удивляет, что С++-погромисты не знают таких вещей. Конструкторы и деструкторы — cамая полезная фича языка, и 95% погромистов не знает, как этим пользоваться.
Dummy00001 30.01.2017 19:40 # +1
о, нет, знаю: на кресты и их компилеры полагатся ни в чем нельзя. (как и на десктопных макак которые компилеры раз в неделю меняют.)
буду рад если просветишь, потому что на стандарт все равно забил, и самый свежий компилер под рукой это гцц 4.8.
roman-kashitsyn 30.01.2017 19:45 # +3
Если в конструкторе по какой-либо причине происходит исключение, всё уже сконструированные поля автоматически разрушается в порядке обратном тому, в котором они были сконструированы. Деструктор конструируемого объекта при этом, понятное дело, не вызывается. Это позволяет писать простой, понятный и корректный код без портянок try/catch. Поэтому порядок членов в классе и инициализаторов в конструкторе важен.
Всё это работало ещё в сраном сfront-е и никогда не изменится — это суть языка. Почитай Inside the C++ Object Model на досуге, на редкость занимательная книжица.
Dummy00001 30.01.2017 20:04 # 0
это я когда то слышал. класная теория. если бы только у меня практического опыта который говорит что это не всегда/не везде работает, то я бы с радостью этим пользовался. лично как-то кторы переписывал потому что память текла, потому что деструкторы полей не вызывались. и я это нашел только потому что в теории не верю - только в практику.
ЗЫ о. ты мне напомнил. видел еще грабли когда конпилер порядок инициализации полей менял. вставляешь в конструкторы принтфы - работает как надо. удаляешь принтфы - криво. но это очень древняя история со времен гцц 2.95/билдер 5.5/vc++6.
roman-kashitsyn 30.01.2017 22:38 # +1
Обжёгся на молоке, дует и на воду.
На твоём компиляторе не работает? Указатели тоже на nullptr проверяешь перед тем, как удалить? А результат оператора new?
Dummy00001 30.01.2017 22:47 # +1
Ты пословицу изкаверкал. "Раз молоком обжёгся - на воду дуешь". 10+ лет работы с недоделаными компилерами - включая и текущий момент - это не "раз".
Я бы рад новыми компилерами пользоватся - компилерами на которые можно полагатся - но гамно на текущем проекте даже темплейтов не умеет (IAR 5.10/5.50).
guestinho 30.01.2017 22:50 # 0
Dummy00001 30.01.2017 23:09 # +2
с точки зрения gcc, 3.х слегка сосали. 4.х, С++03 и частично С++11, где-то только в 2008-10 году стабилизировались. 5.1 вышел в 2015 и был первым гцц где С++11 был официально полноценно поддержан.
а народ тут повествует как если бы щасце неглючных компилеров наступило вечность назад.
guestinho 30.01.2017 23:14 # 0
roman-kashitsyn 30.01.2017 23:23 # 0
То, о чём я говорю, относится к стандарту 98 года.
Dummy00001 31.01.2017 12:00 # +1
... который только до конца в 2003 допилили.
но какая в ж разница какой год если ни в 98 ни в '03 не было ни одного компайлера который 100% этого стандарта не умел.
roman-kashitsyn 30.01.2017 23:18 # 0
Так бы и сказал, что у тебя не С++, а си с классами, и компилятор, не поддерживающий даже стандарт 98 года.
То, что когда-то компиляторы были плохими, не означает того, что не нужно знать базовую семантику языка, на котором пишешь.
Xom94ok 30.01.2017 23:53 # +2
Держите плюсик. Я бы кружечку горячего чаю/какао вам налил в знак соболезнования.
bormand 31.01.2017 00:02 # 0
guest 31.01.2017 00:06 # +1
bormand 30.01.2017 22:50 # 0
Если оно nothrow - куда деваться...
Antervis 31.01.2017 06:16 # +1
ну не надо о больном то...
Antervis 31.01.2017 06:15 # 0
ЗЫЫ вообще, в языке есть всего две оптимизации, позволяющие менять наблюдаемое поведение: RVO и copy elision. А "вставил printf - заработало" - это обычно не в компиляторе дело, а какой-то метод стек портит (возможно, из-за некорректных соглашений о вызовах)
Dummy00001 31.01.2017 12:05 # 0
нет. там были просто глюки. деструктор уже сконструированого под-объекта просто не вызывался, почему и память не освобождалась.
эффект принтфа был в том что он предотвращал инлайнинг конструкторов. без инлайнов - код генерился правильный. заинлайненый - кривой.
Antervis 31.01.2017 14:52 # 0
roman-kashitsyn 30.01.2017 19:34 # 0
assert(IsInitialized()) в каждый метод вставляешь?
Dummy00001 30.01.2017 19:36 # 0
huesto 30.01.2017 19:42 # +1
Dummy00001 30.01.2017 20:16 # 0
с другой стороны, по личному опыту, эта проверка смысла мало имеет, потому что кривой this редко бывает NULL.
bormand 30.01.2017 19:38 # 0
Да, приходится. Исключений не от хорошей жизни нету :(
bormand 30.01.2017 21:44 # 0
Тут хотя бы джвухфазная инициализация скрыта от юзера. И невалидный объект не запилишь.
bormand 30.01.2017 20:07 # +4
roman-kashitsyn 30.01.2017 22:33 # 0
bormand 30.01.2017 22:52 # 0
Правильное, имхо, поля сделать смартпоинтерами...
roman-kashitsyn 30.01.2017 23:10 # +1
Это да, но не всегда возможно. На собесе обычно явно говорят, что члены класса менять нельзя.
bormand 31.01.2017 00:05 # +1
roman-kashitsyn 31.01.2017 01:08 # +1
Нормально. Это одно из типовых решений.
Antervis 31.01.2017 06:19 # 0
bormand 31.01.2017 18:00 # 0
А если у этих объектов деструктор нетривиальный?
Antervis 31.01.2017 22:05 # 0
bormand 30.01.2017 19:47 # 0
А теперь настрой мне waifu (добавь туда сертификатики CA, к примеру) перед конструированием kawaii.
roman-kashitsyn 30.01.2017 19:50 # +2
bormand 30.01.2017 19:54 # 0
roman-kashitsyn 30.01.2017 19:56 # +1
bormand 30.01.2017 20:32 # 0
bormand 30.01.2017 20:40 # +1
huesto 30.01.2017 20:43 # 0
bormand 30.01.2017 20:46 # 0
guestinho 30.01.2017 20:58 # 0
А потом прикрутим боровчекер к шлангу, и будет у нас говнораст.
Antervis 31.01.2017 06:21 # 0
bormand 31.01.2017 06:33 # 0
Antervis 31.01.2017 06:48 # 0
bormand 31.01.2017 18:00 # 0
Antervis 31.01.2017 22:14 # 0
bormand 31.01.2017 22:16 # 0
Теперь по коду гуляют джва инстанса "синглтона" (один из них скоро сдохнет, но не сразу).
З.Ы. Или там какой-то дополнительный семафорчик есть, а не только weak_ptr?
З.З.Ы. Всё, пора спать, дополнительный семафор там однозначно есть. Ибо сами shared_ptr и weak_ptr нельзя юзать из джвух потоков.
bormand 31.01.2017 22:29 # 0
Ткни меня носом, если я не прав.
Antervis 01.02.2017 06:01 # 0
bormand 01.02.2017 06:23 # 0
Но вот сам шаред птр не потокобезопасен. И в джва треда без лочки/атомиков с ним работать нельзя.
А атомиков для weak я что-то не нашёл (только для шаред).
roman-kashitsyn 01.02.2017 12:24 # +3
История из жизни: ревьюил разок код, где хотели реализовать "горящее" обновление конфигурации процесса при получении SIGHUP. Конфиг положили в глобальный shared_ptr, который читался тредами-воркерами и время от времени перезаписывался новой версией асинхронно тредом, слушающим сигналы.
Люди почему-то решили, что shared_ptr "потокобезопасный", и можно делать такие вещи без всяких мутексов. Так вот — нельзя. Можно безопасно копировать shared_ptr из разных потоков. А вот чтение в одном потоке объекта, который изменяется в другом без внешней блокировки — это точно такой же датарейс.
Antervis 01.02.2017 13:35 # 0
roman-kashitsyn 01.02.2017 14:16 # +1
Здесь грабель нет. Грабли появляются, когда ты кладёшь новый объект в shared_ptr без мутекса.
bormand 30.01.2017 18:25 # 0
Глупо, имхо. Нафиг на ровном месте грабли раскладывать? Конпелятор же один хуй сделает по-своему (в порядке объявления полей, забив на порядок инициализаторов в конструкторе). А без этого ворнинга кто-нибудь рано или поздно не посмотрит на порядок членов в классе и обосрётся с конструктором.
Dummy00001 30.01.2017 18:42 # 0
если у тебя ктор не зависит от порядка инициализации - все делается явно - то и граблей никаких нет.
знаю что в крестах есть фанаты референсов, которые без этого просто жить не могут. но это те же самые идиоты которым либо лень один символ больше напечатать, либо наивно думают что так как нет '->' то код будет быстрее потому что нет дереференса.
вообщем - маразм.
bormand 30.01.2017 18:43 # 0
Я согласен. Но если кто-то по-неопытности (или по-необходимости) въебёт зависимость - лучше уж ворнинг, чем молчаливый UB.
А ворнинга про "зависимость от порядка инициализации" то нету, надеешься всё это отбить на ревью?
Dummy00001 30.01.2017 18:55 # 0
да. архитектить/дезайнить компилеры все таки еще не умеют. ;)
я всегда пытаюсь кторы легкими делать. и по граблям зависимостей инициализации ходил - как и по граблям тормозных кторов. (у меня был как-то раз плачевный опыт когда объект ключа для хэша (доморощеного) создавался в среднем дольше чем вычесление ключи + поиск в самом хэше.)
huesto 30.01.2017 18:59 # 0
> идиоты
Вот это предъявы. Обоснуй.
> лень один символ больше напечатать, либо наивно думают что так как нет '->' то код будет быстрее
Про то, что ссылки используют, потому что они безопаснее, ты не слышал конечно же?
Dummy00001 30.01.2017 19:10 # 0
чем они безопастнее?
когда увижу хотя бы один проект где не будут из указателей референсы делать (и не будет `if (&ref != NULL)`) я может быть и поверю в это преславутую безопастность.
huesto 30.01.2017 19:20 # 0
Тут неоднократно обсуждали, что компилятор делает с такими if'ами (https://godbolt.org/g/2EHGbO).
Dummy00001 30.01.2017 19:27 # 0
о какое щчастье. другими словами, референсы говно по дезайну, с какой стороны на них не смотреть.
PS проверку дропает только начиная с гцц 6. в пятерке она еще генерится. где дискусия почему проверку дропают?
huesto 30.01.2017 19:38 # +3
> почему проверку дропают
Потому что ссылка не может быть нулевой. Ты ведь хороший программист и не разыменовывал нулевой указатель? Это UB!
Antervis 31.01.2017 06:26 # 0
Antervis 31.01.2017 06:23 # 0
А моя иде сама меняет . на -> даже когда не прошу блеать
референс нужен в т.ч. для адекватной семантики копирования. В этом нет ничего зазорного
kipar 30.01.2017 18:04 # 0
huesto 30.01.2017 18:07 # 0
huesto 30.01.2017 18:11 # 0
Antervis 31.01.2017 06:28 # 0
bormand 30.01.2017 18:16 # 0
> а более глупый не развернул константы, думает что она достижима
Бывает и хуже: http://govnokod.ru/12472
huesto 30.01.2017 18:18 # +2
Dummy00001 30.01.2017 18:45 # +1
потому что в старые времена тупой главный цикл - int main() { while(1) {}; } - уже кидал этот ворнинг.
huesto 30.01.2017 20:49 # +1
bormand 30.01.2017 20:51 # 0
З.Ы. ИРЛ я всё-таки не такой упоротый, как тут.
Dummy00001 31.01.2017 12:22 # 0
самые упортые на форумы не ходят. что бы компромисы искать - надо разговаривать. а если слишком долго разговаривать, то коллеги могут начать догадываться какой дебил. вообщем, коммуникация, как обычно.
barop 30.01.2017 20:55 # +1
guestinho 30.01.2017 21:01 # +1
barop 30.01.2017 21:07 # 0
guestinho 30.01.2017 21:10 # 0
barop 30.01.2017 21:17 # 0
Если окажется что и там никто не умеет программировать, то придется признать что все люди -- идиоты и тебя спасет только стартап.
-----
зы: я тоже иногда бугурчу. Мне кажется что все кругом пишут тупой бойлерплейт, да еще и не документированный. А должны писать тонкие и красивые фреймворки, которые сами будут решать все проблемы, а потом еще их документировать так, чтобы я прочитал гайд, и всё понял а не сидел в дебагере 8 часов
CHayT 30.01.2017 21:25 # +4
Передай своим коллегам, что они анскиллы. Над тру интерпрайзом ты в дебаггере не посидишь -- хартбиты поедут и всё ребутнётся вместе с твоим дебаггером.
barop 30.01.2017 21:28 # 0
на самом деле про дебагер это я конечно загнул. Иногда достаточно 8 часов почитать код и всё становится понятно.
bormand 30.01.2017 21:26 # +2
Да тут скорее не "не умеет", а "программирует не так, как я".
У всех свои профдеформации, везде свои гайдлайны, да и специфика проекта порой ограничения накладывает.
barop 30.01.2017 21:29 # +1
Молодой программист должен считать говнокодерами всех, кто программирует не так, как он.
Xom94ok 31.01.2017 00:07 # +3
- набраться харизмы и терпения
- убедить всех, что они - тупые мудаки
- постоянно тыкать их носом в насранное и возюкать, возюкать, как котят
- конфликты игнорировать, уходить с работы вовремя, вкусно кушать и вволю спать
- гуси, ответный звонок, это всё
та спокойно нужно относиться
все косячат, у всех какие-то тараканы; вполне возможно, более чем обоснованные
Dummy00001 31.01.2017 12:26 # 0
В конце, решения должны принимать те, кто несут ответственность за конечный результат.
"Как справляться с такими рабочими ситуациями?"
С друг другом разговарить. Учится у друг друга.
Если не способен учится - либо садить в угол и давать ему ручные тесты делать, либо в начальники промотить.
guest 31.01.2017 13:13 # +1
Antervis 31.01.2017 14:54 # 0
Когда такое было последний раз коллегу уволили. <пафос>Моё мнение - эталон</пафос>
guest 31.01.2017 14:57 # 0
guest 31.01.2017 08:15 # 0
Dummy00001 31.01.2017 12:30 # 0
не верю. но линуха под рукой потестировать нет. память для возващаемого объекта выделяется на стеке - и выделяется она всегда. отсутствие/присутствие return'а в С/С++ никогда проблемой не было, потому что calling convention не пасцалева.
guest 31.01.2017 13:04 # 0
Dummy00001 31.01.2017 13:34 # 0
guest 31.01.2017 13:44 # 0
guest 31.01.2017 13:11 # 0
http://coliru.stacked-crooked.com/a/5eacd8836d69a3dd
http://coliru.stacked-crooked.com/a/88fa5a7c5df2f583
guest 31.01.2017 13:04 # 0