powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Указатели... Они совсем отсутствуют в C#? Что с ними не так?
25 сообщений из 25, страница 1 из 1
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738274
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или я дико туплю, но все что удалось нагуглить ".NET не поддерживает указатели в том виде, в котором их поддерживает C++"

Мучаюсь тут с перестановками, на 10 элементах жрет почти 500 метров, на 11 элементах уже 7 гигов...

Весьма логично переставлять не копии объектов, а указатели на них, но гугл глух к моим запросам, все C++ предлагает при слове "указатель"

Неужели нет такой простой возможности?


ЗЫ.
объекты при замере памяти:
Код: c#
1.
2.
3.
4.
5.
{
string (пока пустой)
double
double
}
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738281
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlНеужели нет такой простой возможности?а где тест про 7 гигов?
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738283
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
namespace ttt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

       private void button1_Click(object sender, EventArgs e)
        {

	   int[] npl = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };

           var shuffle = ShowAllCombinations(npl);

       }


        public static List<List<T>> ShowAllCombinations<T>(IList<T> arr, List<List<T>> list = null, List<T> current = null)
        {
            if (list == null) list = new List<List<T>>();
            if (current == null) current = new List<T>();
            if (arr.Count == 0) 
            {
                list.Add(current);
                return list;
            }
            for (int i = 0; i < arr.Count; i++) 
            {
                List<T> lst = new List<T>(arr);
                lst.RemoveAt(i);
                var newlst = new List<T>(current);
                newlst.Add(arr[i]);
                ShowAllCombinations(lst, list, newlst);
            }
            return list;
        }

    }
}
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738284
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IntPtr тип указателя
так же указатели "как в с++" доступны в unsafe коде.
структуры по умолчанию передаются по значение, классы по указателю
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738285
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. размер типа int от размера указателя для 32 бит. архитектуры ничем не отличается.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738286
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Так, ну ок, инт в шарпе объект - значит по указателю, тогда какого лешего это дело 7 гигов жрет если вариантов меньше 40 млн (ну предположим что 40) тогда 8 байт на указатель (64бит) умноженный на 40 млн - всего 240 метров...
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738287
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да даже если еще значение приписать - ну умножим на два = 480 метров... откуда 7 гигов?

Чтото я совсем не понимаю
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738289
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

поинтересуйтесь что такое "сборщик мусора", он достаточно "ленивый")
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738293
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlДа даже если еще значение приписать - ну умножим на два = 480 метров... откуда 7 гигов?

Чтото я совсем не понимаю
Вы на каждой итерации создаете 2 новых List<T> объекта, при этом даже не указывайте их размер. При этом это всё еще и в рекурсии.
учтите так же, что большие массивы будут размещаться в ЛоХе, а это приведет к еще большему расточительству памяти.
вообще любые рекурсивные операции требуют больше памяти, так как чем больше вы погружаетесь в рекурсию тем больше хвостов в памяти после себя оставляете. Ведь выделив памяти на 1 рекурсии, эта память будет задействована, пока все остальные не будут выполнены.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738297
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Похоже гдето Вы не совсем правы - после самой ф-ции вызвал GC.Collect(); - ничего не изменилось - сам результирующий список занимает столько, а хотелось бы чтоб он был указателями на изначальный список
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738300
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlпосле самой ф-ции вызвал GC.Collect(); - ничего не изменилось
так он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем)
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738302
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlинт в шарпе объект - значит по указателю
Вам бы книжку почитать...
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738307
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRтак он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем)
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

Попробовал, стало вообще 8 гигов
(в Diagnostic Tools)
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738341
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlДа что ты пристал со своими тестами?

У меня же не какаято конкретная программа не работает. Общий вопрос.ну дак рекурсия. Дальше можно не читать, иди ты лесом со своей памятью.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738350
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть там указатели.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/

Только зачем они нужны - годами потом buffer overflow в коде выискивать?
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738351
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatТолько зачем они нужны - годами потом buffer overflow в коде выискивать?+1
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738364
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRiskatelsqlпосле самой ф-ции вызвал GC.Collect(); - ничего не изменилось
так он же "ленивый", попробуйте так (хотя это никому не нужное "насилие", если попросят - дотнет подвинется без проблем)
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Автора это не спасет, т.к. мусора у него нет.
21744302 Он генерит List<List<T>> со всеми вариантами комбинаций массива:
Код: c#
1.
int[] npl = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };


А это 11! (39 916 800) объектов List<int> по 11 элементов в каждом.

Странно что 7 гиг они занимают, т.к. это по 175 байт на одну комбинацию.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738366
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesВы на каждой итерации создаете 2 новых List<T> объекта, при этом даже не указывайте их размер. При этом это всё еще и в рекурсии.
учтите так же, что большие массивы будут размещаться в ЛоХе, а это приведет к еще большему расточительству памяти.
вообще любые рекурсивные операции требуют больше памяти, так как чем больше вы погружаетесь в рекурсию тем больше хвостов в памяти после себя оставляете. Ведь выделив памяти на 1 рекурсии, эта память будет задействована, пока все остальные не будут выполнены.
Учитывая, что автор пытается найти все перестановки массива 11 интов - это 11!*11*4 = 1756339200 = ~ 1.63 Гб памяти чисто под конечный результат без учета памяти, отводимой под всю инфраструктуру для хранения конечных и промежуточных результатов. Неудивительно, что на выходе получается 7 Гб. Такие прожорливые алгоритмы требуют глубокой проработки. Например, вот такой вариант у меня занял чуть меньше 4 Гб.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738368
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вру, есть немного мусора, тут
Код: c#
1.
                list.Add(current);


Надо размер list сразу задать
Код: c#
1.
2.
3.
4.
5.
6.
	if (list == null) {
		list = new List<List<T>>();
		int f = 1;
		for(int i = 2; i <= arr.Count; i++) f *= i;
		list.Capacity = f;
	}
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738562
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я поразмышлял немного - подход изначально неверный. Нельзя хранить в памяти все комбинации. Памяти не хватит. В итоге получается массив N*N! элементов.
Даже при полной оптимизации, если использовать тип byte, то при N = 12 потребуется 5.7 Гб, при 13 - 80 Гб
На диск писать тоже не вариант, 14 - это 1.2 Тб

Надо делать генератор последовательности и с ней работать.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738567
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Дык он молчал про источник кода.
Те что я видел, на входе банальные 8 букв и потом генерация.
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738569
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ну дак рекурсия. Дальше можно не читать, иди ты лесом со своей памятью.
Сорри, пример всетаки понадобился... исправлюсь...

Но рекурсия ИМХО непричем, брекпоинт стоит на закрывающей скобке ф-ции button1click, так что к этому месту ф-ция отработала, GC вызван, это сам результат столько весит...


Сон Веры Павловныэто 11!*11*4 = 1756339200 = ~ 1.63 Гб памяти чисто под конечный результат

Вот именно в этом у меня и вопрос. Если б чтото подобное писалось на С++ то на выходе было бы два массива - исходный, и массив с перестановками, заполненный указателями на исходный. А шарп тащит в результат сами значения. Вот проверил только что (на 10 элементах) int - 638Мб, десятисимвольные строки 934мб. А мне вообще нужно перестанавливать объекты из строки и двух double Вобщем гдето тут я запутался...
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738570
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

что в C#, что в С++, нет никакой разницы, хранить указатели или значения, если вы работайте с типом int, а если это amd64, то разница будет не в вашу пользу. Дело не в указателях
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738579
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlЕсли б чтото подобное писалось на С++
iskatelsqlВобщем гдето тут я запутался...
В выборе языка?
...
Рейтинг: 0 / 0
Указатели... Они совсем отсутствуют в C#? Что с ними не так?
    #39738584
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlА мне вообще нужно перестанавливать объекты из строки и двух double Вобщем гдето тут я запутался...
Необязательно делать перестановки твоего типа. Можно чуть усложнить задачу и генерить комбинации индексов.

Примерно так
Код: c#
1.
2.
3.
4.
5.
6.
7.
MyType arr[4] = ... // массив из 4 твоих объектов
int[] idx = { 0, 1, 2, 3}; 
... //перебираем все комбинации idx и для каждой обработка arr
for(int i = 0; i < 4; i++) {
   int j =idx[i];
   ... //обрабатываем arr[j]
}
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Указатели... Они совсем отсутствуют в C#? Что с ними не так?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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