Berkus
между статической и кучей нет разницы технически
Berkus
на стеке дешевле выделять и потом удалять да, одна инструкция процессора
Ivan
я правильно понимаю, что то, что лежит в статической памяти аллоцируется сразу, а в куче в рантайме?
Ivan
вот и вся разница
Крылатый
Вновь про строки на стеке?)
Крылатый
Давно пора бы)
Ivan
спасибо, ты сделал мой день :)
Berkus
статику грузит загрузчик еще до запуска программы
Ivan
ахахахаха
Ivan
я доволен)
cyberzx 🇷🇺
чем?
Berkus
в особо нормальных системах где есть mmap оно вообще не грузится, а просто mmap-ится
cyberzx 🇷🇺
кажется ты вообще не то оптимизируешь
Ivan
ну, мои предположения подтвердились
Ivan
кажется ты вообще не то оптимизируешь
не, я вообще не оптимизирую, я изучаю)
cyberzx 🇷🇺
Я вы вообще не использовал экзешник для хранения данных. Лучше данные положить в отдельный файл. И уже из него их загрузить куда тебе надо самоу
cyberzx 🇷🇺
Опять же, если у тебя нормальная ОС, можешь просто сделать mmap
Ivan
парни, я не знаю что такое mmap
cyberzx 🇷🇺
ну гугл же
cyberzx 🇷🇺
http://man7.org/linux/man-pages/man2/mmap.2.html
cyberzx 🇷🇺
mmap, munmap - map or unmap files or devices into memory
cyberzx 🇷🇺
У тебя есть какой-нибудь файл на диске, ты можешь просто всё его содержимое отмапить на участок памяти
cyberzx 🇷🇺
В винде такое тоже есть https://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx
Ivan
ээм, отмапить?
Ivan
а разве это не одно и тоже что скопировать побайтово?
Berkus
нет конечно
Berkus
ос читает только те страницы из файла к которым ты обращаешься
Berkus
ну и эффективно это всё кеширует
Ivan
аа, я понял
cyberzx 🇷🇺
ты знаешь как свап работает?
Ivan
но, погоди, если часто обращаешься к файлу, это становится дорого, правильно?
Ivan
потому что каждый раз промах по кешу и дисковая операция чтения
Pavel
Подскажите, является ли хорошим тоном использовать auto и лямбды к месту и не к месту? к пример for(auto i = 0; i < 10; ++i){***}
Berkus
нет, оно в память мапится же
Berkus
вообще чем больше авто тем эффективнее код )
Ivan
ты знаешь как свап работает?
в смысле обменн или подмести?
Pavel
т.е. замена pod типов на auto это вполне норм?
Pavel
если рука дрогнет там и double может быть)))
Ivan
это же почти везде 32 бита, что инт что лонг
Alexey
вообще чем больше авто тем эффективнее код )
Auto снижает читабельность кода(
Berkus
на 64 битных архитектурах нет
cyberzx 🇷🇺
т.е. замена pod типов на auto это вполне норм?
думай о тех, кто будет читать код и пытаться разобраться, что в нём происходит. типизиация не такая уж и плохая штука
Ivan
на 64 битных long long = 128 bit?
Pavel
да не, я то как раз против auto
Berkus
Auto снижает читабельность кода(
дооо, конечно auto ptr = std::make_shared<TMyLongClassName>(more, args); так прямо и снижает
Pavel
просто часто начиню замечать подобный код
cyberzx 🇷🇺
Alexey
Ну для сложных типов разумно его применять. Но писать везде вместо типа auto - не круто
Pavel
auto ptr = doSomething(); ?
Ivan
дооо, конечно auto ptr = std::make_shared<TMyLongClassName>(more, args); так прямо и снижает
ну в этом случае не снижает, но повсеместное использование, особенно когда справа цепочка вызозов, приходится заглядывать что она возращает
cyberzx 🇷🇺
на 64 битных long long = 128 bit?
https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
Berkus
про цепочку вызовов да, согласен
Berkus
в форе прекрасно видно какой будет тип, а авто там например чтобы проще было рефакторить
cyberzx 🇷🇺
auto ptr = doSomething(); ?
зависит от контекста. если doSomething это лямбда или сложный шаблонный класс, то ок
Ivan
щито? sizof(long) == sizeof(long long) ахахах
Berkus
был цикл с 0xF0000000 а стал 0xF00000000 тип сам поменяется
Ivan
так что там со свапом то???
cyberzx 🇷🇺
Berkus
так что там со свапом то???
тот же ммап, вид сбоку
cyberzx 🇷🇺
так что там со свапом то???
если знаешь как работает свап, то значит знаешь как работает файл мэппинг
Ivan
как работает std::swap?
Berkus
https://dl.dropboxusercontent.com/s/6wa1xuu86vwludk/2017-07-20%20at%2000.44.png
cyberzx 🇷🇺
как работает std::swap?
системный свап
Ivan
не знаю
Berkus
Ivan
Подскажите, является ли хорошим тоном использовать auto и лямбды к месту и не к месту? к пример for(auto i = 0; i < 10; ++i){***}
Кстати, возможно, в будущем, когда будешь итерироваться по чему-нибудь, поможет std::transform, лямбду туда можно зафигачить
cyberzx 🇷🇺
Ну почитай хороших книжек по системному программированию. Пригодится по жизни )
Pavel
для лямбд не смогут.
typedef std::function<void()> do_execute; do_execute Foo(); *** do_execute bar = Foo();
cyberzx 🇷🇺
cyberzx 🇷🇺
Я много пишу в функциональном стиле c higher-order functions. типа таких // on_except returns function that catches any thrown exception during // func call and pass it to specified exception handler template<typename Func, typename ExceptionHandler, size_t... I> auto on_except_impl(Func&& func, ExceptionHandler&& exception_handler, std::index_sequence<I...>) { using Args = get_callable_args<get_signature<Func>>; return [ func = std::forward<Func>(func), exception_handler = std::forward<ExceptionHandler>(exception_handler) ](std::tuple_element_t<I, Args>... args) noexcept { try { func(args...); } catch (...) { exception_handler(std::current_exception(), args...); } }; } Если бы я использовал std::function, то у меня было бы два оверхеда. - постоянные аллокации при type erasure - оптимизатор не смог бы инлайнить вызовы
Pavel
ясно
Pavel
#запишем
cyberzx 🇷🇺
А разве оптимизатор не инлайнит функторы?
Инлайнит. Но не в случае с std::function. Там же в компайл-тайме не известен выполняемый код
Олександр
Указатели на функции он точно не инлайнит (и лямбды туда же)