powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
101 сообщений из 101, показаны все 5 страниц
Как в многопоточной программе ПЕРЕвыделять память?
    #39553385
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял malloc и realloc не являются потокобезопасными.

Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553391
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553402
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

Поэтому надо использовать new / delete, но у этого паттерна нет перевыделения памяти! Например, мне не хватило куска в тысячу байт и я хочу выделить кусок на 2 тысячи байт с переносом туда всех данных из первого куска. Как такое сделать потокобезопасно?

Если это не уровень детсада (а выделенное говорит скорее о ясельной группе), то через mmap() можно замапить один и тот-же файл в несколько разных мест, в т.ч. и с увеличением размера мапы.

Т.е. адреса будут разные, а по факту участок памяти - один.

Но для двух килобайт дергать mmap() - это уж точно, из гаубицы по муравьям
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553405
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ.

хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553534
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553538
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatchтам говорится что можно просто вызывать realloc в разных потоках, но речь о другом - падавану похоже нужно реаллоцировать кусок памяти, в который идет конкурентный доступ.

хотя на самом деле поди пойми, что именно нужно - с фрагментарной базовой подготовкой идти в потоки - это очень смелый шаг.

Падаван хочет то, что написал в топике: из разных потоков параллельно выделять/перевыделять/освобождать куски памяти. Заполнение данными будет происходить в каждом потоке в отдельный кусок памяти.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553560
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553573
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553586
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, т.к. в более ранних стандартах ее нет.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553591
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные).

Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553596
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLТут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны
только с С++17

Во-первых, не говорится. Во-вторых, не путай std::calloc и ::calloc.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553618
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima TКак понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Обычно подобные ограничения указывают для целой строки (потому что в строках не смешивают разнокачественные данные).

Можно и тут посмотреть: https://stackoverflow.com/questions/855763/is-malloc-thread-safe
Про эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь еще сюда глянуть http://en.cppreference.com/w/c/memory/malloc
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553624
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.

Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553630
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLОбычно подобные ограничения указывают для целой строки

Но если ты присмотришься внимательнее, то на данном конкретном ресурсе релевантный кусок
выделяют прямоугольным блоком с тонкой малозаметной рамочкой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553633
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima TПро эту ссылку я уже написал 20956223 , там в ответах написано что определяется рантаймом, т.е. в многопоточных рантаймах потокобезопасные malloc(), realloc() и т.д.

Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553641
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAlekseySQLпропущено...


Не знаю, что вы подразумеваете под словом "рантайм". Я понимаю так: если библиотека написано с учетом многопоточной работы, то она потокобезопасна. Если же запустить функцию, написанную без учета многопоточности, в многопоточном приложении, то само- собой ничего потокобезопасным не станет.
"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553649
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

Не думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами).

Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553650
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 наверное справедливо первое правило
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553656
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchDima Tпропущено...

"рантайм" это сам С/С++, он тоже библиотека, где прописаны функции, в т.ч. malloc(). При компиляции ты выбираешь многопоточный рантайм использовать или однопоточный.

я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553660
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

в линаксе это не так
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553663
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tdbpatchпропущено...


я могу конечно ошибаться, но возможность указать /ML в Visual Studio выпилили еще 12 лет назад. или нет?
про линукс и прочих POSIX тоже конечно было бы прикольно узнать, как вообще можно указать в опциях потоко-небезопасный realloc()

расскажешь?
ХЗ какой у него компилятор. Написал про общий случай, вдруг какая-нибудь экзотика используется.

при чем тут компилятор? runtime это библиотека.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553693
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553716
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ как раз под Линаксом сижу :)

Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?
Как минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт.


AlekseySQLА что насчет memcpy?

А что с ним не так? Он изначально потокобезопасный, ибо не имеет состояния между вызовами. Там только нужно ГАРАНТИРОВАТЬ, что области не пересекаются, иначе использовать memmove

животрепещущее тут:
http://avva.livejournal.com/2323823.html#/2323823.html
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553720
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
1) malloc, realloc являются потокобезопасными.

2) в C++ вообще нужно использовать std::vector
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553721
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima TОткуда инфа? Они потокобезопасны.

пропущено...


Тут http://en.cppreference.com/w/cpp/memory/c/malloc говорится, что они потокобезопасны только с С++17

С рождения они потокобезопасны.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553725
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatchКак минимум это ожидается. Qt вообще перекрывают собой все что можно, если что не так - читай их доку, пиши в саппорт.


Вообще- то Qt ничего не перекрывает, а предоставляет свои дополнительные библиотеки. Если нет желания ими пользоваться, то будет чистый С / С++.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553727
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlekseySQLНасколько я понял malloc и realloc не являются потокобезопасными.

0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
1) malloc, realloc являются потокобезопасными.

2) в C++ вообще нужно использовать std::vector

Большое спасибо!
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553730
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAlekseySQLпропущено...


пропущено...


Ну да, thread-safe определяется реализациямифункций, которые вызываются из библиотек: если они написаны с учетом многопоточности, то все будет ок.
Как понимаю (since C++17) относится только к std::aligned_alloc, т.к. в более ранних стандартах ее нет.

Да этим функциям 100 лет в обед, они всегда были потокобезопасны, как только появились потоки и многопоточные версии CRT.
Другое дело, что ТОЛЬКО СЕЙЧАС (в C++11) этот факт зафиксирован в стандарте как требование (там требование НЕ ТОЛЬКО потоко безопасности, но и относительной упорядоченности вызовов к ним, на сколько я понял из краткого прочтения статьи).
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?

Будут потокобезопасны.

А что насчет memcpy?

НЕ БУДЕТ потокобезопасна.
В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553737
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)


Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39553739
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?

Будут потокобезопасны.

А что насчет memcpy?

НЕ БУДЕТ потокобезопасна.
В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.

Спасибо! Разумеется memcpy в разных потоках будет копировать разную память (каждый поток делает что-то для себя). Я про то, что некоторые функции хранят свое состояние, и их вызов из разных потоков может привести к ошибке.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39554096
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)


Это потому что в копируемой области можно использовать только POD- объекты? У меня как раз такой случай.

Я написал почему.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559237
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559276
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMasterZiv0) ПЕРЕ выделение памяти -- вообще ОЧЕНЬ плохая парадигма. Нужна новая память -- выделяй, копируй, удаляй старую.
(чтобы понять, почему, почитай спецификацию на функцию realloc , и ты увидишь, что пользоваться ею мягко говоря нельзя, т.е. просто бесполезно)
Ну полнейшая же чушь. Выделена у меня гора памяти, и надо довыделить еще пару байт. И что, мне не пытаться сделать мгновенный реаллок? Сразу снова выделять, копировать и освобождать?
реаллок что по твоему должен делать? Вжух и память появилась? Про адресное пространство не забывай: например тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то, и тут ты просишь еще 10 байт ... , но тебе же надо не 10 байт а непрерывный кусок 100510 байт, поэтому копирование.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559277
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то
А если не выделили?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559279
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockDima Tнапример тебе выделили память с адреса 0 по 100500, а с адреса 100501 выделили еще кому-то
А если не выделили?
Может и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559296
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожет и так, но спросить "так или не так" не у кого. Работа менеджера памяти не документирована.
Именно есть у кого. Для этого и предназначен realloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559302
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?

Пока в странице, вообще нет проблем расшириться.

А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема)
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559303
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уровне ЦПУ
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559317
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?
Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами.
Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559326
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?
Пока в странице, вообще нет проблем расшириться.Это у системы память запрашивается страницами.
Диспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдой, то шанс довыделить память реаллоком (для указателя - обычная задача) без перевыделения/копирования/освобождения, был бы равен 50%. Что в 2 раза производительнее.
Не знаю, как там по версиям сей, но:
1. В старых делфях менеджер резервирует константу, которую можно задать;
2. В Win10 вообще ИИ - вначале резервируется 128, потом килобайт, потом 10, потом не знаю - это я на глаз проверил. Это дает прирост производительности в сотни-тысячи раз при использовании GlobalRealloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559331
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockДаже если бы это было правдой,

Это лехко проверить. Например тут или тут .
В общем случае эффективность realloc сильно зависит выбранного от менеджера памяти.
ИМХО использование realloc - плохая практика.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559527
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockBasil A. SidorovДиспетчер памяти в приложении оперирует более мелкими блоками - байт этак по восемь.Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559534
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockпропущено...
Даже если бы это было правдойВы правда думаете, что вектор из миллиона указателей на килобайтовый буфер получит по отдельной странице на каждый буфер?Мне это безразлично. Я не думаю, а знаю, что в менеджерах памяти, которыми я пользуюсь, realloc возвращает (мгновенно) не NULL в подавляющем большинстве случаев. И проверка "на всякий случай" с долгим перевыделением и копированием может вообще никогда не отработать за время жизни программы, а если и отрабатывает - то крайне редко. Зависит от размера довыделяемой памяти. Например, если по 512 байт довыделяю - то 1 раз из 10, по 10кб - 3 раза из 10, по 4 байта - 0 раз из 100.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559537
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockМне это безразлично.А зря. Интуиция - плохой советчик.

P.S. Копирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процах.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559545
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovА зря. Интуиция - плохой советчик.Какая интуиция? Я говорил о реальных фактах.
Basil A. SidorovКопирование десятка мегабайт занимает единицы миллисекунд на не самых быстрых процахКак-то скромно упущено количество миллисекунд, необходимое для выделения и освобождения указателя для десятков мегабайт.

P.S. Копирование пройдет быстро, если память уже реально выделена, а не только указатель на нее дан. А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта...
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559546
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovединицы миллисекунд на не самых быстрых процахА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559547
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?А когда при копировании она только реально выделяться начнет, то дело будет станет далеко не только в скорости проца, а и физ. кол-ве памяти, и в винте, и в чем угодно еще, в той же загруженности проца, винта..."А ты не путай свою шерсть с государственной" (ц) кинокомедия "Кавказская пленница".
Есть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложении. Вот последние оперируют блоками с гранулярностью в единицы байт.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559548
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559549
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?Конечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.

Basil A. SidorovЕсть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложенииТак или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559550
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.О, я за этот вариант.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559551
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКонечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.Вы курсы проктостоматологов не заканчивали?
Ещё широко известный в узких кругах dz, лет двадцать тому назад, писал, что не надо стесняться использовать возможности виртуальной памяти: если типово требуется десять мегабайт, но иногда может понадобиться пятьдесят - запрашивайте пятьдесят.Так или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".А вот это сильно зависит от эвристик системного диспетчера виртуальной памяти, доступных ему ресурсов и подсказок, которые могло предоставить приложение.

P.S. Вы из мира сурового хайлоада, постоянно сидящего в свопе или что?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559553
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВы курсы проктостоматологов не заканчивали?
Basil A. SidorovВы из мира сурового хайлоада, постоянно сидящего в свопе или что?
Вы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт.
Чем писать весь этот бред.
И далеко не всегда важно даже, напрямую у системы эту память просить, или через внутренний "в приложении" менеджер.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559555
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт.
1024*1024*1024/4096 раз по байту
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class test {
  public static void main(String[] args) {
    long start = System.nanoTime();
    final int size = 1024*1024*1024;
    byte[] buffer = new byte[size];
    for (int i = 0; i < size - 1; i += 4096) buffer[i] = (byte) 255;
    System.out.println("Total time: " + (System.nanoTime() - start + 512*1024) / (1024*1024) + " ms.");
  }
}

java -Xms2g test
Код: plaintext
Total time: 395 ms.
Я, конечно, понимаю, что суровым рилтаймерам это смешно, но нас, простых кастомеров - вполне устраивает.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559557
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Не нужен этот цикл был. Достаточно было 1 раз 1 элементу массива что-то присвоить.
Да и при чем тут ява, кстати, не понятно. Ну думаю не важно, кто выделял - машина или нет. В общем, поздравляю, у Вас быстрый компьютер :)
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559560
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class test {
  public static void main(String[] args) {
    int size = 512;
    if (args.length > 0) {
      try { size = Integer.parseInt(args[0]); }
      finally {}
    }
    if (size < 0) size = 512;
    if (size > 1024) size = 512;
    Runtime rt = Runtime.getRuntime();
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free");
    long start = System.nanoTime();
    size *= 1024*1024;
    int[] buffer = new int[size];
    for (int i = 0; i < size - 1; i += 4096) buffer[i] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024) / (1024*1024) + " ms total (");
    System.out.println((size * 4L + 512*1024)/1024/1024 + " Mb buffer)");
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free.");
  }
}

максимум на моей железке
Код: plaintext
1.
2.
3.
java -Xms5000m test 833
Memory: 4792 Mb total / 4741 Mb free
  Time: 1220 ms total (3332 Mb buffer)
Memory: 4792 Mb total / 1409 Mb free.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559561
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovА вы разделите миллисекунды на миллионБыл неправ - винда использует "достаточно энергичный" алгоритм.
Но, в любом случае, ~секунда на "почти миллион страниц" - вполне нормальный результат.
Для желающих лучшего есть более продвинутые методики (*map и большие страницы).
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559606
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov~секунда на "почти миллион страниц"О том и речь. Секунда уходит на 1-е обращение к памяти, на остальнвые 999999 уходит меньше миллисекунды.
Но нам на миллион делить не приходится. У на тут про перевыделение памяти топик. И утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559612
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class test {
  public static void main(String[] args) {
    int size = 512;
    if (args.length > 0) {
      try { size = Integer.parseInt(args[0]); }
      catch (NumberFormatException e) {}
      finally {}
    }
    if (size < 1) size = 512;
    if (size > 1024) size = 512;
    size *= 1024*1024;

    int[] buffer = new int[0]; buffer = null;

    Runtime rt = Runtime.getRuntime();
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free");

    long start = System.nanoTime();
    buffer = new int[size]; buffer[buffer.length - 1] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024)/1024/1024 + " ms total (");
    System.out.println((4L * buffer.length + 512*1024)/1024/1024 + " Mb buffer)");

    buffer = null; System.gc();

    start = System.nanoTime();
    buffer = new int[size]; buffer[buffer.length - 1] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024)/1024/1024 + " ms total (");
    System.out.println((4L * buffer.length + 512*1024)/1024/1024 + " Mb buffer)");
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free.");
  }
}

... и много раз
Код: 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.
Memory: 4907 Mb total / 4855 Mb free
  Time: 2 ms total (4 Mb buffer)
  Time: 1 ms total (4 Mb buffer)
Memory: 4907 Mb total / 4851 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 6 ms total (16 Mb buffer)
  Time: 2 ms total (16 Mb buffer)
Memory: 4907 Mb total / 4839 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 23 ms total (64 Mb buffer)
  Time: 20 ms total (64 Mb buffer)
Memory: 4907 Mb total / 4791 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 92 ms total (256 Mb buffer)
  Time: 44 ms total (256 Mb buffer)
Memory: 4907 Mb total / 4599 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 369 ms total (1024 Mb buffer)
  Time: 146 ms total (1024 Mb buffer)
Memory: 4907 Mb total / 3832 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 1211 ms total (3332 Mb buffer)
  Time: 451 ms total (3332 Mb buffer)
Memory: 4907 Mb total / 1523 Mb free.
Поэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять.
И добавлю.
Если "типично-иногда" много - перемножаете ожидаемые "иногда" и "много", запрашиваете буфер суммарного размера и делаете собственное управление памятью, оптимизированное для вашего частного случая.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559639
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПоэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять.
Ладно один раз я ему про Фому, он мне про Ярему. Но повторяться...

Последний раз предлагаю подумать. Возьмем vector или динамический массив из других языков, раз тут уж и ява пошла.
Когда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса):
1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:
2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559641
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovраспределить миллион страниц медленно в первый разИменно это я и пытался объяснить, указывая, что на миллион нам делить и усреднять не получится, т.к. память для копирования только выделена и именно и будет при копировании этот первый долгий раз.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559650
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКогда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса):
1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:Я предлагаю немного подумать и сразу создать вектор на десять тысяч элементов. Лишние ~70-150 килобайт никого не задавят. Вас - в том числе.2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.Массивы ява "условно примитивные" (их создаёт JVM) и массивы эти ни разу не динамические - после создания невозможно изменить размер массива.
Вот разновсяческие векторы из библиотеки коллекций - да, динамика. Деталями реализации не интересовался.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559663
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЯ предлагаю немного подумать и сразу создать вектор на десять тысяч элементовПонятно, все проблемы решаем умножением на 10. Создателям rtl отправь свое предложение подумать, я о их алгоритмах речь вел.
Но какие нафиг алгоритмы, если можно подумать и на 10 умножить. Всё, вопросов больше не имею.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559664
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovМассивы яваПоток мысли. Я не спрашивал, как устроены статические массивы ява. Впрочем, у меня уже давно всё.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559673
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точки - нуллы, плюсики - указатели, звездочки - блоки данных.
Есть вектор:
Код: plaintext
1.
.
.
Мы заполняем вектор данными:
Код: plaintext
1.
+ ***
+ ****
Обнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого:
Код: plaintext
1.
2.
3.
. <- + **
. <- + ****
.
.
Задлянафига в этой схеме realloc, если требуется копирование только (маленьких) указателей?
Какой редиска мешал оценить максимальную потребность и сразу создать вектор нужного размера? Кому, кроме суровых микроконтрольщиков нужна такая пессимизация?

P.S. Если вы о чём-то другом, то поясните, кто на ком стоял.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559676
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovОбнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого
Это что, серьезно?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559677
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКакой редиска мешал оценить максимальную потребностьУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559679
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия".
Вы точно не путаете массив переменных и массив указателей на переменные?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559681
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.Я повторюсь - создаём массив массивов и реализуем алгоритм, оптимизированный под ваш частный случай.
Ну или берём готовое из boost/stl.
Ни в одном из этих случаев не возникает нужда в realloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559686
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия".
Вы точно не путаете массив переменных и массив указателей на переменные?Да, я говорю про массив указателей переменной длины, который дает возможность добавить элемент без пересоздания на больший.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559688
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНу или берём готовое из boost/stl.
Ни в одном из этих случаев не возникает нужда в realloc.
Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д.
Мне писать уже ничего не надо, мне всё понятно.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559692
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559701
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?Да, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска realloc и начинай писать письмо разработчикам.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559718
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и?
Подсказка: наберите в строке поиска "alloc("
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559765
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока вы не поубивали друг друга, замечу, что контейнеры позволяют резервировать память, сводя число realloc-ов к минимуму.
оффтопвспоминается история из прошлого века, когда я был молодым и зелёным , мы делали вдвоём софт для некого девайса в НИИ, я делал пользовательскую часть, с кучей графиков. Делалось всё на LabView, у которой тогда уже были нормальные контейнеры (в STL они уже тоже были) встроенные прямо в средства построения графиков. Так вот, я по ходу поступления данных добавлял их в массив графика. Всё было ок, но через некоторое время учёные пожаловались на тормоза. Я загрустил, а мой более умный напарник даже не глядя в "код", сразу сказал, что я не сделал резервирование памяти, а компонент графика на каждое добавление делает realloc, что на уже на нескольких десятках тысяч записей становится заметно.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559968
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockBasil A. SidorovНу или берём готовое из boost/stl.
Ни в одном из этих случаев не возникает нужда в realloc.
Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д.
Мне писать уже ничего не надо, мне всё понятно.

std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559976
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНе думаю, что сам С/С++ внутри себя реализует стандартные функции. Для этого используются отдельные библиотеки, которые подключаются в программу с помощью директив препроцессору #include. И вот именно эти реализации библиотек определяют возможность многопоточной работы (а не факт запуска компиляции с какими- либо ключами).

Например, по вашей ссылке видно, что malloc требует библиотеки <stdlib.h>.Никакие библиотеки с помощью директивы препроцессора #include в сборку не включаются. Включение библиотек указывается отдельно компилятору (обычно с помощью аргумента командной строки). Стандартные библиотеки Си и C++ могут быть не только библиотеками динамической линковки времени выполнения (runtime), но и статическими - слинкованными полностью с самим исполняемым файлом программы (к примеру, у "гнуса" есть параметры командной строки "-static-libgcc" и "-static-libstdc++").
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559982
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак и не понял: под всеми ОС QT- программа, исползующая malloc, realloc и free, будет работать корректно?

А что насчет memcpy?

НЕ БУДЕТ потокобезопасна.
В том смысле, что с одной памятью в разных потоках оперировать ею нельзя.Оперировать-то можно, но программу придется писать с учётом барьеров компилятора и кэша процессора.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559984
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНикто не забыл, что память выделяется страницами, да еще и с виртуализацией страниц?

Пока в странице, вообще нет проблем расшириться.

А если нет - то дописать процессору в табличку аллокаций VM линейное расширение (я не настолько ос разработчик, но АФАИК, это тоже небольшая проблема)Это она для кучи выделяется страницами, а кучей заведует библиотечный менеджер памяти из стандартной либы, который может на одной странице выделять блоки для разных потоков.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559996
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov~секунда на "почти миллион страниц" - вполне нормальный результат.А ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560005
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560041
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T https://msdn.microsoft.com/ru-ru/library/dd335933.aspx Так же, как и в Win32, размер страницы на платформе x64 равен 4 Кб.Спасибо, почитал.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560076
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560179
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вЪюDima T,

очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух.
А в линуксе они двухмегабайтные?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного про споры выше про realloc(): не думаю что realloc() без копирования обходится, но в виндовсе есть HeapReAlloc() , а вот здесь уже средства ОС, т.е. перемещение и довставка страниц, вместо копирования. Если кому очень надо, то можно воспользоваться.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560182
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tне думаю что realloc() без копирования обходится
Думать не надо. Достаточно произвести тест на 3 строки кода.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560183
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и?
Подсказка: наберите в строке поиска "alloc("
Ок, именно в Вашем спец-примере я не нашел "alloc(". Всё, значит, считайте, что я не прав. Копируйте память всегда и дальше. Хотя понятное дело, что перевыделение памяти происходит где-то в недрах, в base::resize... но искать я не намерен, не вижу смысла что-то доказывать.
Считаете, что vector всегда тупо копирует память при необходимости увеличения изначально зарезервированного массива указателей? Ок, я не спорю.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560184
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы.
Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560186
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockDima Tне думаю что realloc() без копирования обходится
Думать не надо. Достаточно произвести тест на 3 строки кода.
Давай ссылку на тест из 3 строк.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560195
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
#include <stdio.h>
#include <windows.h>

#define TEST_SIZE ( 1024 * 1024 * 512 )

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	char cText[ 50 ];
	void *p, *np;
	DWORD dwStart, dwTime;

	p = malloc( TEST_SIZE );

	dwStart = GetTickCount();
	np = realloc( p, TEST_SIZE + 1 );
	dwTime = ( DWORD ) ( GetTickCount() - dwStart );

	free( p );

	if( np )
		sprintf( cText, "realloc time: %d", dwTime );
	else
	  sprintf( cText, "realloc returns NULL" );

	MessageBox( 0, cText, "", 0 );

	p = malloc( TEST_SIZE );

	dwStart = GetTickCount();
	np = malloc( TEST_SIZE + 1 );
	memcpy( np, p, TEST_SIZE );
	free( p );
	dwTime = ( DWORD ) ( GetTickCount() - dwStart );

	free( np );

	sprintf( cText, "alloc/memcpy/free time: %d", dwTime );
	MessageBox( 0, cText, "", 0 );

	return 0;
}


1-й MessageBox показывает "realloc time: 0", 2-й - ~2000 миллисекунд. Это на моём компе.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560202
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devА ты уверен, что современная 64-битная операционная система выделяет JVM'у страницы именно по 4кБ, а не по 4Мб?Ну, если не касаться совсем гигантских страниц, то, насколько мне известно:
1. По два мегабайта, а не по четыре;
2. Чтобы запросить у системы именно большие страницы требуется несколько предусловий, поэтому:
2.1. По умолчанию всегда выделяются четырёхкилобайтовые страницы;
2.2. Для работы с большими страницами есть отдельная опция комстроки, которая может быть проигнорирована системой;

А действуют все эти ограничения потому, что у больших страниц чёткая и достаточно узкая область - работа с большими объёмом физической памяти.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560211
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockMasterZiv std::vector не может использовать С-шный realloc, поскольку оперирует не только с POD-структурами, а также использует аллокаторы.
Угу. Какой-то магический, другой менеджер памяти, в котором нет и не нужен realloc. Хорошо.
нет и ненужен std::allocator .
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560213
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TвЪюDima T,

очень старая статья. Я совсем не специалист в виндовс но даже мне понятно что виндовс 10 должна использовать двухмегабайтные странички. Иначе микрософту никогда недагнать линух.
А в линуксе они двухмегабайтные?
в glibc стандартном аллокаторе - нет.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560215
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вЪюнет и ненужен
Ну не нужен так не нужен.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560243
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чисто приколоться
Код: 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.
public class test {
  private static int size = 0;
  private static int[] source = null, target = null;
  private static Runtime rt = Runtime.getRuntime();

  private static int[] alloc(int[] buffer, int size) {
    long start = System.nanoTime();
    buffer = new int[size];
    System.out.print(" Alloc " + (4L * buffer.length + 512*1024)/1024/1024 + " Mb in ");
    System.out.println((System.nanoTime() - start + 512*1024)/1024/1024 + " ms");
    return buffer;
  }

  private static void copy(int[] source, int[] target) {
    long start = System.nanoTime();
    System.arraycopy(source,0, target,0, source.length);
    System.out.print("  Copy " + (4L * source.length + 512*1024)/1024/1024 + " Mb in ");
    System.out.println((System.nanoTime() - start + 512*1024)/1024/1024 + " ms");
  }

  private static void stat() {
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free");
  }

  public static void main(String[] args) {
    try { size = Integer.parseInt(args[0]); }
    catch (RuntimeException e) {}
    finally {}
    if (size < 1) size = 512;
    if (size > 1024) size = 512;
    size *= 1024*1024;

    stat();
    source = alloc(source,size);
    target = alloc(target,size+1024*1024);
    copy(source,target);
    stat();
    System.out.println("");
  }
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
VM settings:
    Min. Heap Size: 3.50G
    Max. Heap Size: 3.50G
    Ergonomics Machine Class: client
    Using VM: Java HotSpot(TM) 64-Bit Server VM

Memory: 3435 Mb total / 3399 Mb free
 Alloc 1152 Mb in 140 ms
 Alloc 1156 Mb in 151 ms
  Copy 1152 Mb in 420 ms
Memory: 3435 Mb total / 1091 Mb free
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560254
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Ну вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало. М это при достатке памяти.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560287
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНу вот уже 700 мс, и еще приплюсовать сюда время на освобождение - оно далеко не мало.Это Спарта Ява - встроенный (фоновый) сборщик мусора.
Но вы не понимаете главного: исключая специально подобранные случаи - невозможно воспользоваться "быстрым довыделением памяти" в реальной жизни .
Поэтому в реальной жизни никто не будет работать с одним куском "в размер доступной памяти" - создадут массив из блоков более адекватного размера и будут разносить данных по этим (суб)блокам.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560291
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
int main(int argc, char** argv[])
{
	DWORD dwStart, dwTime;
	void *p, *np;
	p = malloc(TEST_SIZE);

	dwStart = GetTickCount();
	np = realloc(p, TEST_SIZE + 100500);
	dwTime = (DWORD)(GetTickCount() - dwStart);
	
	printf("realloc() %d ms\n", dwTime);
	free(np);


	std::vector<char> v(TEST_SIZE);

	dwStart = GetTickCount();
	v.resize(TEST_SIZE + 100500);
	dwTime = (DWORD)(GetTickCount() - dwStart);

	printf("v.resize() %d ms\n", dwTime);
	return 0;
}


Результат
Код: plaintext
1.
realloc() 234 ms
v.resize() 172 ms
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560499
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНо вы не понимаете главногоЯ вообще ничего не понимаю практически. При этом страх берет, когда подумаешь, что же тогда понимают те, кто со мной спорит/поучает.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39560505
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРезультат
Код: plaintext
1.
realloc() 234 ms
v.resize() 172 ms

Прекрасный результат.
Вавод: аллокатор вектора, который довыделяет память без реаллока, т.е. путем выделения бОльшего блока и копирования, работает быстрее, чем [сработавший] реаллок.
Всё, меня разбили в пух и прах
...
Рейтинг: 0 / 0
101 сообщений из 101, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]