|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Или я дико туплю, но все что удалось нагуглить ".NET не поддерживает указатели в том виде, в котором их поддерживает C++" Мучаюсь тут с перестановками, на 10 элементах жрет почти 500 метров, на 11 элементах уже 7 гигов... Весьма логично переставлять не копии объектов, а указатели на них, но гугл глух к моим запросам, все C++ предлагает при слове "указатель" Неужели нет такой простой возможности? ЗЫ. объекты при замере памяти: Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:03 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlНеужели нет такой простой возможности?а где тест про 7 гигов? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:28 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Petro123, Да что ты пристал со своими тестами? У меня же не какаято конкретная программа не работает. Общий вопрос. Но для особо до..чивых вот, тоже 7 гигов ест. Код: c# 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:41 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
IntPtr тип указателя так же указатели "как в с++" доступны в unsafe коде. структуры по умолчанию передаются по значение, классы по указателю ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:50 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
p.s. размер типа int от размера указателя для 32 бит. архитектуры ничем не отличается. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:51 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Roman Mejtes, Так, ну ок, инт в шарпе объект - значит по указателю, тогда какого лешего это дело 7 гигов жрет если вариантов меньше 40 млн (ну предположим что 40) тогда 8 байт на указатель (64бит) умноженный на 40 млн - всего 240 метров... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 22:59 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Да даже если еще значение приписать - ну умножим на два = 480 метров... откуда 7 гигов? Чтото я совсем не понимаю ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:02 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsql, поинтересуйтесь что такое "сборщик мусора", он достаточно "ленивый") ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:14 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlДа даже если еще значение приписать - ну умножим на два = 480 метров... откуда 7 гигов? Чтото я совсем не понимаю Вы на каждой итерации создаете 2 новых List<T> объекта, при этом даже не указывайте их размер. При этом это всё еще и в рекурсии. учтите так же, что большие массивы будут размещаться в ЛоХе, а это приведет к еще большему расточительству памяти. вообще любые рекурсивные операции требуют больше памяти, так как чем больше вы погружаетесь в рекурсию тем больше хвостов в памяти после себя оставляете. Ведь выделив памяти на 1 рекурсии, эта память будет задействована, пока все остальные не будут выполнены. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:18 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Roman Mejtes, Похоже гдето Вы не совсем правы - после самой ф-ции вызвал GC.Collect(); - ничего не изменилось - сам результирующий список занимает столько, а хотелось бы чтоб он был указателями на изначальный список ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:27 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlпосле самой ф-ции вызвал GC.Collect(); - ничего не изменилось так он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем) GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:39 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlинт в шарпе объект - значит по указателю Вам бы книжку почитать... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2018, 23:47 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
LRтак он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем) GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Попробовал, стало вообще 8 гигов (в Diagnostic Tools) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 00:32 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlДа что ты пристал со своими тестами? У меня же не какаято конкретная программа не работает. Общий вопрос.ну дак рекурсия. Дальше можно не читать, иди ты лесом со своей памятью. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 07:23 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Есть там указатели. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/ Только зачем они нужны - годами потом buffer overflow в коде выискивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 08:09 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
fkthatТолько зачем они нужны - годами потом buffer overflow в коде выискивать?+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 08:11 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
LRiskatelsqlпосле самой ф-ции вызвал GC.Collect(); - ничего не изменилось так он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем) GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Автора это не спасет, т.к. мусора у него нет. 21744302 Он генерит List<List<T>> со всеми вариантами комбинаций массива: Код: c# 1.
А это 11! (39 916 800) объектов List<int> по 11 элементов в каждом. Странно что 7 гиг они занимают, т.к. это по 175 байт на одну комбинацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 09:28 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Roman MejtesВы на каждой итерации создаете 2 новых List<T> объекта, при этом даже не указывайте их размер. При этом это всё еще и в рекурсии. учтите так же, что большие массивы будут размещаться в ЛоХе, а это приведет к еще большему расточительству памяти. вообще любые рекурсивные операции требуют больше памяти, так как чем больше вы погружаетесь в рекурсию тем больше хвостов в памяти после себя оставляете. Ведь выделив памяти на 1 рекурсии, эта память будет задействована, пока все остальные не будут выполнены. Учитывая, что автор пытается найти все перестановки массива 11 интов - это 11!*11*4 = 1756339200 = ~ 1.63 Гб памяти чисто под конечный результат без учета памяти, отводимой под всю инфраструктуру для хранения конечных и промежуточных результатов. Неудивительно, что на выходе получается 7 Гб. Такие прожорливые алгоритмы требуют глубокой проработки. Например, вот такой вариант у меня занял чуть меньше 4 Гб. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 09:34 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Вру, есть немного мусора, тут Код: c# 1.
Надо размер list сразу задать Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 09:38 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Я поразмышлял немного - подход изначально неверный. Нельзя хранить в памяти все комбинации. Памяти не хватит. В итоге получается массив N*N! элементов. Даже при полной оптимизации, если использовать тип byte, то при N = 12 потребуется 5.7 Гб, при 13 - 80 Гб На диск писать тоже не вариант, 14 - это 1.2 Тб Надо делать генератор последовательности и с ней работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:01 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Dima T, Дык он молчал про источник кода. Те что я видел, на входе банальные 8 букв и потом генерация. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:07 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
Petro123ну дак рекурсия. Дальше можно не читать, иди ты лесом со своей памятью. Сорри, пример всетаки понадобился... исправлюсь... Но рекурсия ИМХО непричем, брекпоинт стоит на закрывающей скобке ф-ции button1click, так что к этому месту ф-ция отработала, GC вызван, это сам результат столько весит... Сон Веры Павловныэто 11!*11*4 = 1756339200 = ~ 1.63 Гб памяти чисто под конечный результат Вот именно в этом у меня и вопрос. Если б чтото подобное писалось на С++ то на выходе было бы два массива - исходный, и массив с перестановками, заполненный указателями на исходный. А шарп тащит в результат сами значения. Вот проверил только что (на 10 элементах) int - 638Мб, десятисимвольные строки 934мб. А мне вообще нужно перестанавливать объекты из строки и двух double Вобщем гдето тут я запутался... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:09 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsql, что в C#, что в С++, нет никакой разницы, хранить указатели или значения, если вы работайте с типом int, а если это amd64, то разница будет не в вашу пользу. Дело не в указателях ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:11 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlЕсли б чтото подобное писалось на С++ iskatelsqlВобщем гдето тут я запутался... В выборе языка? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:19 |
|
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
|
|||
---|---|---|---|
#18+
iskatelsqlА мне вообще нужно перестанавливать объекты из строки и двух double Вобщем гдето тут я запутался... Необязательно делать перестановки твоего типа. Можно чуть усложнить задачу и генерить комбинации индексов. Примерно так Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2018, 14:22 |
|
|
start [/forum/topic.php?fid=20&fpage=25&tid=1399155]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 415ms |
0 / 0 |