Berkus
между статической и кучей нет разницы технически
Berkus
на стеке дешевле выделять и потом удалять да, одна инструкция процессора
Ivan
я правильно понимаю, что то, что лежит в статической памяти аллоцируется сразу, а в куче в рантайме?
Ivan
вот и вся разница
Крылатый
Вновь про строки на стеке?)
Крылатый
Давно пора бы)
Berkus
Ivan
спасибо, ты сделал мой день :)
Berkus
статику грузит загрузчик еще до запуска программы
Ivan
ахахахаха
Ivan
я доволен)
cyberzx 🇷🇺
чем?
Berkus
в особо нормальных системах где есть mmap оно вообще не грузится, а просто mmap-ится
cyberzx 🇷🇺
кажется ты вообще не то оптимизируешь
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
Berkus
вообще чем больше авто тем эффективнее код )
cyberzx 🇷🇺
Pavel
т.е. замена pod типов на auto это вполне норм?
Berkus
Pavel
если рука дрогнет там и double может быть)))
Ivan
это же почти везде 32 бита, что инт что лонг
Alexey
Berkus
на 64 битных архитектурах нет
Ivan
на 64 битных long long = 128 bit?
Pavel
да не, я то как раз против auto
Pavel
просто часто начиню замечать подобный код
cyberzx 🇷🇺
Alexey
Ну для сложных типов разумно его применять.
Но писать везде вместо типа auto - не круто
Pavel
auto ptr = doSomething(); ?
Berkus
про цепочку вызовов да, согласен
Berkus
в форе прекрасно видно какой будет тип, а авто там например чтобы проще было рефакторить
Ivan
щито? sizof(long) == sizeof(long long) ахахах
Berkus
был цикл с 0xF0000000 а стал 0xF00000000 тип сам поменяется
Pavel
Ivan
так что там со свапом то???
cyberzx 🇷🇺
Berkus
Ivan
как работает std::swap?
Berkus
https://dl.dropboxusercontent.com/s/6wa1xuu86vwludk/2017-07-20%20at%2000.44.png
cyberzx 🇷🇺
Ivan
не знаю
Berkus
Ivan
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
#запишем
Олександр
Олександр
Указатели на функции он точно не инлайнит (и лямбды туда же)