Ivan
что именно?
Как три точки превращаются, в аргументы
Berkus
Как три точки превращаются, в аргументы
через стек и указатель на аргументы в стеке, и calling convention
Ivan
Это с помощью самого языка можно закодить?
Berkus
ну да, адрес аргумента + его размер, и вперед
Ivan
Стоп, адрес аргументов ты где узнал?
Berkus
на стеке
Ivan
))
Ivan
Как узнал сколько аргументов?
Berkus
#define va_start(ap, param) __builtin_va_start(ap, param) #define va_end(ap) __builtin_va_end(ap) #define va_arg(ap, type) __builtin_va_arg(ap, type) примерно вот так, компиляторная магия
Крылатый
На MSVC компиле оно работает ИНАЧЕ.
Ivan
Дальше что. Что такое builtin
Ivan
А не идёт у меня вглубь
Ivan
))))
Anatoly
я спрашиваю на собеседовании о проблемах функции void foo(int& r, ...) { ... }
Anatoly
ну, не будет она работать как ожидает автор
Крылатый
И про VA_ARGS в студии, стоит учитывать https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly
Anatoly
ну, ему казалось, что здесь нет криминала и что можно спокойно использовать va_arg
Anatoly
для обработки аргументов переданных в ellipsis
Anatoly
оно возмет чужой stack frame, поскольку r - ссылка
Ivan
Я, кстати, как-то делал дешёвую рефлексию на макросах #define MAKE_STRUCT(X) struct { string s = ##X };
Ivan
Нифига себе у вас вопросы на собеседовании
Anatoly
под виндой этот код не работает
Anatoly
не понимаю, как умудряется ideone это обрабатывать
Anatoly
The parameter parmN is the rightmost parameter in the variable parameter list of the function definition (the one just before the ...).219 If the parameter parmN is a pack expansion (17.5.3) or an entity resulting from a lambda capture (8.1.5), the program is ill-formed, no diagnostic required. If the parameter parmN is of a reference type, or of a type that is not compatible with the type that results when passing an argument for which there is no parameter, the behavior is undefined.
Anatoly
это из стандарта 21.10.1 Header <cstdarg> synopsis [cstdarg
Anatoly
в принципе, behavior is undefined мы и наблюдаем
Stas
под виндой этот код не работает
double stddev(int& count, ...) { double sum = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { double num = va_arg(args, double); sum += num; } va_end(args); return sum; } #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); Application& app = Application::get_instance(argc, argv); int count = 3; qDebug() << stddev(count, 1.0, 2.0, 3.0) << '\n'; return app.exec(); }вернуло 6. все ништяк. Под виндой комплект Qt 5.8.0 стандартный с комплектным mingw
Anatoly
но круто, что gcc расправился с этой ссылкой, в винде там адрес рефернса и как результат чужой стек
Anatoly
вернее, в студии
Stas
Короче, я в этом чате сижу и после каждого сообщения думаю: боже какой я имбицил... а тут еще такие вопросы на собеседовании... боже мама роди меня обратно.
Stas
Да чет похоже я вообще нифига не понимаю.
Anatoly
хотя может ты и прав и это может шокировать соискателя
Ivan
Который иногда пользовался принтф и никогда не думал как он работает
Ivan
И это нормально
Anatoly
да, удивлен
Igor
хотя может ты и прав и это может шокировать соискателя
бегло пробежал взглядом вашу дискуссию, шокирован, ну не могу я сходу понять почему от передачи ссылки вместо значения происходит такой коллапс, теперь пойду почитаю, что там про va_start пишут
Anatoly
если va_start реализован через взятие адреса, то ответ очевиден
Igor
вопрос даже несколько в другом: это именно со ссылкой такая бяка, или с указателем тоже будет?
Anatoly
с указателем все железобетонно
Anatoly
он полноценная переменная занимающая свое место в стеке аргументов функции
Stas
Но ведь ссылка этож указатель неявный так сказать...
Stas
епта пойду застрелюсь
Anatoly
ну, круто, выросли
Anatoly
15-а тоже не компилирует
Berkus
а не важно, написано что не работает если аргумент перед ... это референс или другой который нарушает экспансию
Roman
часто слышу аргумент: "when you have a global you've made a mistake in the design" по теме singleton'ов и аж засомневался... если у меня действительно есть API класс, который действительно должен быть 1 инстанцией на всё приложение... я разве неправильно подхожу к дизайну с singleton'ом??
Igor
this
Igor
он полноценная переменная занимающая свое место в стеке аргументов функции
Igor
Но ведь ссылка этож указатель неявный так сказать...
Igor
неа
Igor
епта пойду застрелюсь
Anatoly
Но ведь ссылка этож указатель неявный так сказать...
ссылка реализована как константкный укзазатель, но при этом при взятии адреса ссылки ты всегда получишь адрес реального объекта, а при взятии адреса указателя адрес именно указателя
Stanislav
юзай шланг/с2 )))
Roman
есть какие-то явные недостатки превращения API в глобальный singleton? я лично честно говоря не вижу в этом проблемы
Roman
речь идёт об API классе из SDK пакета, т.е. такой API из SDK не имеет смысла инстанцировать несколько раз
Roman
если API thread-safe тогда проблем с конкуррентным доступом быть не должно же
Roman
эта API представляет собой абстракцию удалённого ресурса (по сети)
Berkus
в современном стандарте с++ инициализация статиков атомарная
Berkus
ну так эцсамое, есть паттерн
ep
Товарищи, кто-нибудь сталкивался с таким, что VS 2015 начинает жрать 20-40% CPU. Вернее не она сама, а некий процесс Microsoft Visual C++ Package Server. И часто он не завершается при закрытии студии. Может кто-то уже с таким сталкивался и знает что это и как исправить?
Igor
в современном стандарте с++ инициализация статиков атомарная
один раз поймал великолепный баг, связанный с этим (а может и не совсем с этим) https://stackoverflow.com/questions/32517234/access-violation-on-static-initialization
Igor
tl;dr: winXP и server2003 не умеют в thread-safe static при подгрузке dll
ep
Даже так, студия не закрывается, пока руками не завершишь этот процесс PackageServer. После этого студия закрывается с ошибкой (типа падает).
G
Добрый вечер. Нашел в поиске вашу группу . Я совсем недавно начал изучать язык , и хотел бы узнать могу ли я здесь задавать вопросы ? Сразу говорю что они будут глупые но по теме. Просто многие эксперты горят от простых вопросов.пис
Stanislav
для новичков
Vladislav
С++11-17 это же по сути простые доработки поверх, их не сложно будет применить потом
лучше сразу с c++11 начинать - там многие best practices поменялись
Vladislav
вот 14/17 уже можно инкрементально накатить
Vladislav
тем более что они не у всех есть пока
Vlad
https://godbolt.org/g/L5kDdd
Vlad
TIL, что во вложенном (и только во вложенном) классе нельзя делать default-конструктор, если есть мембер с дефолтным значением