Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Насколько я понял malloc и realloc не являются потокобезопасными. Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Откуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно? Если это не уровень детсада (а выделенное говорит скорее о ясельной группе), то через mmap() можно замапить один и тот-же файл в несколько разных мест, в т.ч. и с увеличением размера мапы. Т.е. адреса будут разные, а по факту участок памяти - один. Но для двух килобайт дергать mmap() - это уж точно, из гаубицы по муравьям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 12:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. Откуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. там говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ. хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 13:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TОткуда инфа? Они потокобезопасны. http://en.cppreference.com/w/c/memory/realloc realloc is thread-safe: it behaves as though only accessing the memory locations visible through its argument, and not any static storage. Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchтам говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ. хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг. Падаван хочет то, что написал в топике: из разных потоков параллельно выделять/перевыделять/освобождать куски памяти. Заполнение данными будет происходить в каждом потоке в отдельный кусок памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:16 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TОткуда инфа? Они потокобезопасны. пропущено... Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 Не нашел такого по ссылке. Потокобезопасность определяется используемым рантаймом https://stackoverflow.com/questions/855763/is-malloc-thread-safe To that question the answer is it depends on your runtime library, and possibly on the compiler flags you use. On any modern UNIX you'll get a thread-safe malloc by default. On Windows, use /MT, /MTd, /MD or /MDd flags to get thread-safe runtime library. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:33 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TНе нашел такого по ссылке. авторThe following functions are required to be thread-safe: The library versions of operator new and operator delete User replacement versions of global operator new and operator delete std::calloc, std::malloc, std::realloc, std::aligned_alloc (since C++17) Calls to these functions that allocate or deallocate a particular unit of storage occur in a single total order, and each such deallocation call happens-before the next allocation (if any) in this order. Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:47 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TНе нашел такого по ссылке. авторThe following functions are required to be thread-safe: The library versions of operator new and operator delete User replacement versions of global operator new and operator delete std::calloc, std::malloc, std::realloc, std::aligned_alloc (since C++17) Calls to these functions that allocate or deallocate a particular unit of storage occur in a single total order, and each such deallocation call happens-before the next allocation (if any) in this order. Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные). Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:59 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLТут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 Во-первых, не говорится. Во-вторых, не путай std::calloc и ::calloc. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:04 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные). Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe Про эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:19 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Можешь еще сюда глянуть http://en.cppreference.com/w/c/memory/malloc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:20 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:24 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLОбычно подобные ограничения указывают для целой строки Но если ты присмотришься внимательнее, то на данном конкретном ресурсе релевантный кусок выделяют прямоугольным блоком с тонкой малозаметной рамочкой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:32 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:33 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLпропущено... Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:42 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. Не думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами). Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:49 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д. Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет. 1) в современном мире принято правило - в С runtime (C standard library) - фукнции потокобезопасны, если не оговорено иное. более подробно тут: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01 2) для win32 нужно отдельно искать, естественно. там вообще ИМНИП все с точностью до наоборот - все считается небезопасным, если не оговорена безопасность. хотя на пересечении POSIX и Win32 наверное справедливо первое правило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchDima Tпропущено... "рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный. я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Ага, все проше. Есть CRT. И single-threaded CRT больше не доступен https://docs.microsoft.com/en-gb/cpp/c-runtime-library/multithreaded-libraries-performance и даже больше - Microsoft даже некоторые изначально потоко-небезопасные фукции переделала в безопасные: https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l в линаксе это не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 15:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tdbpatchпропущено... я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет? про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc() расскажешь? ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется. при чем тут компилятор? runtime это библиотека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchАга, все проше. Есть CRT. И single-threaded CRT больше не доступен https://docs.microsoft.com/en-gb/cpp/c-runtime-library/multithreaded-libraries-performance и даже больше - Microsoft даже некоторые изначально потоко-небезопасные фукции переделала в безопасные: https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l в линаксе это не так Я как раз под Линаксом сижу :) Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? А что насчет memcpy? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:32 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ как раз под Линаксом сижу :) Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Как минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт. AlekseySQLА что насчет memcpy? А что с ним не так? Он изначально потокобезопасный, ибо не имеет состояния между вызовами. Там только нужно ГАРАНТИРОВАТЬ, что области не пересекаются, иначе использовать memmove животрепещущее тут: http://avva.livejournal.com/2323823.html#/2323823.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:49 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. 0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) 1) malloc, realloc являются потокобезопасными. 2) в C++ вообще нужно использовать std::vector ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:52 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TОткуда инфа? Они потокобезопасны. пропущено... Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17 С рождения они потокобезопасны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:53 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
dbpatchКак минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт. Вообще- то Qt ничего не перекрывает, а предоставляет свои дополнительные библиотеки. Если нет желания ими пользоваться, то будет чистый С / С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными. 0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) 1) malloc, realloc являются потокобезопасными. 2) в C++ вообще нужно использовать std::vector Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLпропущено... пропущено... Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок. Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет. Да этим функциям 100 лет в обед, они всегда были потокобезопасны, как только появились потоки и многопоточные версии CRT. Другое дело, что ТОЛЬКО СЕЙЧАС (в C++11) этот факт зафиксирован в стандарте как требование (там требование НЕ ТОЛЬКО потоко безопасности, но и относительной упорядоченности вызовов к ним, на сколько я понял из краткого прочтения статьи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 16:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Будут потокобезопасны. А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:06 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? Будут потокобезопасны. А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя. Спасибо! Разумеется memcpy в разных потоках будет копировать разную память (каждый поток делает что-то для себя). Я про то, что некоторые функции хранят свое состояние, и их вызов из разных потоков может привести к ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 17:09 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай. Я написал почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 10:07 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 19:07 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую. (чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно) Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать? реаллок что по твоему должен делать? Вжух и память появилась? Про адресное пространство не забывай: например тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то, и тут ты просишь еще 10 байт ... , но тебе же надо не 10 байт а непрерывный кусок 100510 байт, поэтому копирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то А если не выделили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:20 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockDima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то А если не выделили? Может и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 20:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TМожет и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована. Именно есть у кого. Для этого и предназначен realloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:24 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Никто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться. А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
на уровне ЦПУ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 22:52 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами. Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 23:46 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovSiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами. Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдой, то шанс довыделить память реаллоком (для указателя - обычная задача) без перевыделения/копирования/освобождения, был бы равен 50%. Что в 2 раза производительнее. Не знаю, как там по версиям сей, но: 1. В старых делфях менеджер резервирует константу, которую можно задать; 2. В Win10 вообще ИИ - вначале резервируется 128, потом килобайт, потом 10, потом не знаю - это я на глаз проверил. Это дает прирост производительности в сотни-тысячи раз при использовании GlobalRealloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 02:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockДаже если бы это было правдой, Это лехко проверить. Например тут или тут . В общем случае эффективность realloc сильно зависит выбранного от менеджера памяти. ИМХО использование realloc - плохая практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 04:17 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockBasil A. SidorovДиспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:23 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockпропущено... Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?Мне это безразлично. Я не думаю, а знаю, что в менеджерах памяти, которыми я пользуюсь, realloc возвращает (мгновенно) не NULL в подавляющем большинстве случаев. И проверка "на всякий случай" с долгим перевыделением и копированием может вообще никогда не отработать за время жизни программы, а если и отрабатывает - то крайне редко. Зависит от размера довыделяемой памяти. Например, если по 512 байт довыделяю - то 1 раз из 10, по 10кб - 3 раза из 10, по 4 байта - 0 раз из 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:44 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockМне это безразлично.А зря. Интуиция - плохой советчик. P.S. Копирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2017, 22:51 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovА зря. Интуиция - плохой советчик.Какая интуиция? Я говорил о реальных фактах. Basil A. SidorovКопирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процахКак-то скромно упущено количество миллисекунд, необходимое для выделения и освобождения указателя для десятков мегабайт. P.S. Копирование пройдет быстро, если память уже реально выделена, а не только указатель на нее дан. А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:10 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovединицы миллисекунд на не самых быстрых процахА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:14 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта..."А ты не путай свою шерсть с государственной" (ц) кинокомедия "Кавказская пленница". Есть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложении. Вот последние оперируют блоками с гранулярностью в единицы байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:15 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:17 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?Конечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика. Basil A. SidorovЕсть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложенииТак или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:21 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.О, я за этот вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:22 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockКонечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.Вы курсы проктостоматологов не заканчивали? Ещё широко известный в узких кругах dz, лет двадцать тому назад, писал, что не надо стесняться использовать возможности виртуальной памяти: если типово требуется десять мегабайт, но иногда может понадобиться пятьдесят - запрашивайте пятьдесят.Так или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".А вот это сильно зависит от эвристик системного диспетчера виртуальной памяти, доступных ему ресурсов и подсказок, которые могло предоставить приложение. P.S. Вы из мира сурового хайлоада, постоянно сидящего в свопе или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovВы курсы проктостоматологов не заканчивали? Basil A. SidorovВы из мира сурового хайлоада, постоянно сидящего в свопе или что? Вы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт. Чем писать весь этот бред. И далеко не всегда важно даже, напрямую у системы эту память просить, или через внутренний "в приложении" менеджер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 03:56 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockВы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт. 1024*1024*1024/4096 раз по байту Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. java -Xms2g test Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 04:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Не нужен этот цикл был. Достаточно было 1 раз 1 элементу массива что-то присвоить. Да и при чем тут ява, кстати, не понятно. Ну думаю не важно, кто выделял - машина или нет. В общем, поздравляю, у Вас быстрый компьютер :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 04:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockНе нужен этот цикл был.А вы разделите миллисекунды на миллион - станет понятно зачем тут цикл.Да и при чем тут ява, кстати, не понятно.Притом, что "javac test.java&java test" - очень просто и, что немаловажно - очень кросплатформенно достигая пределов Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. максимум на моей железке Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 05:09 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovА вы разделите миллисекунды на миллионБыл неправ - винда использует "достаточно энергичный" алгоритм. Но, в любом случае, ~секунда на "почти миллион страниц" - вполне нормальный результат. Для желающих лучшего есть более продвинутые методики (*map и большие страницы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 05:21 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov~секунда на "почти миллион страниц"О том и речь. Секунда уходит на 1-е обращение к памяти, на остальнвые 999999 уходит меньше миллисекунды. Но нам на миллион делить не приходится. У на тут про перевыделение памяти топик. И утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 14:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockИ утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить."Никогда и ничего не доводи до абсурда, ибо человек, желающий трапезовать поздно вечером рискует трапезовать рано по утру" (ц) Козьма Прутков. Во-первых, не надо работать с "указателями на гигабайт" без специальных методик. Во-вторых, ваше рассуждение содержит изъян: распределить миллион страниц медленно в первый раз. повторим на бис ... Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... и много раз Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. И добавлю. Если "типично-иногда" много - перемножаете ожидаемые "иногда" и "много", запрашиваете буфер суммарного размера и делаете собственное управление памятью, оптимизированное для вашего частного случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 15:30 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovПоэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять. Ладно один раз я ему про Фому, он мне про Ярему. Но повторяться... Последний раз предлагаю подумать. Возьмем vector или динамический массив из других языков, раз тут уж и ява пошла. Когда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса): 1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение: 2. Какой вариант из этих, по вашему, используют для таких задач RTL языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:23 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovраспределить миллион страниц медленно в первый разИменно это я и пытался объяснить, указывая, что на миллион нам делить и усреднять не получится, т.к. память для копирования только выделена и именно и будет при копировании этот первый долгий раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockКогда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса): 1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:Я предлагаю немного подумать и сразу создать вектор на десять тысяч элементов. Лишние ~70-150 килобайт никого не задавят. Вас - в том числе.2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.Массивы ява "условно примитивные" (их создаёт JVM) и массивы эти ни разу не динамические - после создания невозможно изменить размер массива. Вот разновсяческие векторы из библиотеки коллекций - да, динамика. Деталями реализации не интересовался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЯ предлагаю немного подумать и сразу создать вектор на десять тысяч элементовПонятно, все проблемы решаем умножением на 10. Создателям rtl отправь свое предложение подумать, я о их алгоритмах речь вел. Но какие нафиг алгоритмы, если можно подумать и на 10 умножить. Всё, вопросов больше не имею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 17:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovМассивы яваПоток мысли. Я не спрашивал, как устроены статические массивы ява. Впрочем, у меня уже давно всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:00 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Точки - нуллы, плюсики - указатели, звездочки - блоки данных. Есть вектор: Код: plaintext 1. Код: plaintext 1. Код: plaintext 1. 2. 3. Какой редиска мешал оценить максимальную потребность и сразу создать вектор нужного размера? Кому, кроме суровых микроконтрольщиков нужна такая пессимизация? P.S. Если вы о чём-то другом, то поясните, кто на ком стоял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:22 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovОбнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого Это что, серьезно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:28 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКакой редиска мешал оценить максимальную потребностьУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:31 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия". Вы точно не путаете массив переменных и массив указателей на переменные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:34 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.Я повторюсь - создаём массив массивов и реализуем алгоритм, оптимизированный под ваш частный случай. Ну или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:37 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия". Вы точно не путаете массив переменных и массив указателей на переменные?Да, я говорю про массив указателей переменной длины, который дает возможность добавить элемент без пересоздания на больший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНу или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д. Мне писать уже ничего не надо, мне всё понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 18:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 19:04 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?Да, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска realloc и начинай писать письмо разработчикам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 19:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и? Подсказка: наберите в строке поиска "alloc(" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2017, 20:48 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Пока вы не поубивали друг друга, замечу, что контейнеры позволяют резервировать память, сводя число realloc-ов к минимуму. оффтопвспоминается история из прошлого века, когда я был молодым и зелёным , мы делали вдвоём софт для некого девайса в НИИ, я делал пользовательскую часть, с кучей графиков. Делалось всё на LabView, у которой тогда уже были нормальные контейнеры (в STL они уже тоже были) встроенные прямо в средства построения графиков. Так вот, я по ходу поступления данных добавлял их в массив графика. Всё было ок, но через некоторое время учёные пожаловались на тормоза. Я загрустил, а мой более умный напарник даже не глядя в "код", сразу сказал, что я не сделал резервирование памяти, а компонент графика на каждое добавление делает realloc, что на уже на нескольких десятках тысяч записей становится заметно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 05:40 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockBasil A. SidorovНу или берём готовое из boost/stl. Ни в одном из этих случаев не возникает нужда в realloc. Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д. Мне писать уже ничего не надо, мне всё понятно. std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНе думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами). Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>.Никакие библиотеки с помощью директивы препроцессора #include в сборку не включаются. Включение библиотек указывается отдельно компилятору (обычно с помощью аргумента командной строки). Стандартные библиотеки Си и C++ могут быть не только библиотеками динамической линковки времени выполнения (runtime), но и статическими - слинкованными полностью с самим исполняемым файлом программы (к примеру, у "гнуса" есть параметры командной строки "-static-libgcc" и "-static-libstdc++"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:51 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно? А что насчет memcpy? НЕ БУДЕТ потокобезопасна. В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.Оперировать-то можно, но программу придется писать с учётом барьеров компилятора и кэша процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц? Пока в странице, вообще нет проблем расшириться. А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема)Это она для кучи выделяется страницами, а кучей заведует библиотечный менеджер памяти из стандартной либы, который может на одной странице выделять блоки для разных потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 13:58 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov~секунда на "почти миллион страниц" - вполне нормальный результат.А ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 14:17 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 14:25 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.Спасибо, почитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 15:13 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 16:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
вЪюDima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. А в линуксе они двухмегабайтные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:38 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Немного про споры выше про realloc(): не думаю что realloc() без копирования обходится, но в виндовсе есть HeapReAlloc() , а вот здесь уже средства ОС, т.е. перемещение и довставка страниц, вместо копирования. Если кому очень надо, то можно воспользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:45 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima Tне думаю что realloc() без копирования обходится Думать не надо. Достаточно произвести тест на 3 строки кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:50 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovYuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и? Подсказка: наберите в строке поиска "alloc(" Ок, именно в Вашем спец-примере я не нашел "alloc(". Всё, значит, считайте, что я не прав. Копируйте память всегда и дальше. Хотя понятное дело, что перевыделение памяти происходит где-то в недрах, в base::resize... но искать я не намерен, не вижу смысла что-то доказывать. Считаете, что vector всегда тупо копирует память при необходимости увеличения изначально зарезервированного массива указателей? Ок, я не спорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:54 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
MasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 20:55 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockDima Tне думаю что realloc() без копирования обходится Думать не надо. Достаточно произвести тест на 3 строки кода. Давай ссылку на тест из 3 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:01 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TYuRockпропущено... Думать не надо. Достаточно произвести тест на 3 строки кода. Давай ссылку на тест из 3 строк. На тебе ссылку Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 1-й MessageBox показывает "realloc time: 0", 2-й - ~2000 миллисекунд. Это на моём компе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:30 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
rdb_devА ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб?Ну, если не касаться совсем гигантских страниц, то, насколько мне известно: 1. По два мегабайта, а не по четыре; 2. Чтобы запросить у системы именно большие страницы требуется несколько предусловий, поэтому: 2.1. По умолчанию всегда выделяются четырёхкилобайтовые страницы; 2.2. Для работы с большими страницами есть отдельная опция комстроки, которая может быть проигнорирована системой; А действуют все эти ограничения потому, что у больших страниц чёткая и достаточно узкая область - работа с большими объёмом физической памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 21:53 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockMasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы. Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо. нет и ненужен std::allocator . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TвЪюDima T, очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух. А в линуксе они двухмегабайтные? в glibc стандартном аллокаторе - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:43 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
вЪюнет и ненужен Ну не нужен так не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2017, 22:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
чисто приколоться Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 03:37 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Ну вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало. М это при достатке памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 04:35 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRockНу вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало.Это Спарта Ява - встроенный (фоновый) сборщик мусора. Но вы не понимаете главного: исключая специально подобранные случаи - невозможно воспользоваться "быстрым довыделением памяти" в реальной жизни . Поэтому в реальной жизни никто не будет работать с одним куском "в размер доступной памяти" - создадут массив из блоков более адекватного размера и будут разносить данных по этим (суб)блокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 07:27 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
YuRock1-й MessageBox показывает "realloc time: 0", 2-й - ~2000 миллисекунд. Это на моём компе. Немного модифицировал тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Результат Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 07:37 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНо вы не понимаете главногоЯ вообще ничего не понимаю практически. При этом страх берет, когда подумаешь, что же тогда понимают те, кто со мной спорит/поучает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 12:57 |
|
||
|
Как в многопоточной программе ПЕРЕвыделять память?
|
|||
|---|---|---|---|
|
#18+
Dima TРезультат Код: plaintext 1. Прекрасный результат. Вавод: аллокатор вектора, который довыделяет память без реаллока, т.е. путем выделения бОльшего блока и копирования, работает быстрее, чем [сработавший] реаллок. Всё, меня разбили в пух и прах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 13:05 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018035]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
121ms |
get tp. blocked users: |
1ms |
| others: | 273ms |
| total: | 599ms |

| 0 / 0 |
