Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
1

Размещение структуры в памяти

07.02.2017, 21:05. Показов 7534. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Где-то вычитал, давно и в память отложилось, что если создаешь переменную структуры через конструктор new, то она будет расположена на куче...
Интересует момент со структурой, когда создаются на кучи, а когда в стеке. Примеры бы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2017, 21:05
Ответы с готовыми решениями:

Размещение массивов в памяти
Доброе время суток! Получается, что многомерные массивы(не вложенные) хранятся в managed памяти...

Размещение в методов памяти
Наверно, сумбурный несколько вопрос, но хотел бы прояснить. Узнал что в javascript при...

Размещение памяти
Здравствуйте, есть 16 gb памяти, что будет быстрее работать, 2 планки по 8gb двухканальный режим,...

Размещение функций в памяти
Помогите бедному-зеленому кое-что устаканить в своей голове! Давно тревожит один вопрос: "как...

15
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 21:07 2
Цитата Сообщение от UseMuse Посмотреть сообщение
Где-то вычитал,
это про с++
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 21:11  [ТС] 3
TopLayer,
Цитата Сообщение от UseMuse Посмотреть сообщение
что если создаешь переменную структуры через конструктор new
даже не так, а что типо если используется ключевое слово new, значит быть объекту на куче
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 21:13 4
UseMuse, наличие new ничего подобного не определяет
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 21:16  [ТС] 5
TopLayer, не подскажешь, как расположить экземпляр структуры на куче?)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 21:20 6
UseMuse, сделать её экземплярным полем класса. Тогда, скорей всего, она окажется в куче. Но, если не ошибаюсь, информация о том, где будет расположен тот или иной программный объект в памяти, не специфицирована.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 21:30  [ТС] 7
TopLayer, вот сделал экземпляры структуры полями, а они судя по результату ведут себя как переменные.
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
using System;
 
namespace ConsoleApplication1
{
    struct Guids
    {
        public Guid guidRef { get; set; }
        public Guids(string str = null)
        {
            guidRef = Guid.NewGuid();
        }
    }
    class Program
    {
        static Guids guids1 = new Guids("");
        static Guids guids2 = new Guids("");
        static void Main(string[] args)
        {
            Console.WriteLine("Начальные данные");
            Console.WriteLine("guids1: {0}", guids1.guidRef);
            Console.WriteLine("guids2: {0}", guids2.guidRef);
            Console.WriteLine("guids1 = guids2");
            guids1 = guids2;
 
            Console.WriteLine("Присвоили новый гуид guids2");
            guids2.guidRef = Guid.NewGuid();
            Console.WriteLine("Результат");
            Console.WriteLine("guids1: {0}", guids1.guidRef);
            Console.WriteLine("guids2: {0}", guids2.guidRef);
 
        }
    }
}
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 21:34 8
Цитата Сообщение от UseMuse Посмотреть сообщение
а они судя по результату ведут себя как переменные
это не имеет никакого отношения к теме
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 21:37  [ТС] 9
Цитата Сообщение от TopLayer Посмотреть сообщение
это не имеет никакого отношения к теме
а что имеет?)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 21:40 10
Цитата Сообщение от UseMuse Посмотреть сообщение
а что имеет?)
Например то, что guids1, guids2, guids1.guidRef, guids2.guidRef размещены, скорее всего, в стеке.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 21:58  [ТС] 11
спасибо конечно, но
Цитата Сообщение от TopLayer Посмотреть сообщение
скорее всего
в качестве ответа меня не устраивает, жду еще варианты
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,711
07.02.2017, 22:14 12
Спецификацию CLR не читал, но ребята с SO говорят, что в последних версиях CLR статические поля, поскольку они связаны с типом объекта, а не экземпляром, хранятся именно в Type-объектах, а поскольку Type - класс, то все статические поля будут хранится в куче, назависимо от того какие они - ссылочные или значимые.
Но нет строгого определения где должны храниться static - члены, главное их свойство - быть доступными на протяжении всей жизни домена приложения. То есть по факту, static члены вообще никогда не подвергаются сборке мусора, вроде как эта область, где хранятся Type-объекты, называется High Frequency Heap.
Про доступность
Static is just for the lifetime - yes. It doesn't say anything about when or where it is stored - just that it's available when you asked for it. A compliant runtime is free to use whatever memory it wants, or even never to load the fields in memory (e.g. keeping it in the image, which is already in memory anyway)
Оттуда же,
That's pretty much it. Everything else is an implementation detail - the specification doesn't care about stack, heap or anything else. It's up to the implementation of the runtime, and a valid runtime could put everything on the stack, if it so desired, or on the heap. And don't forget registers.
Добавлено через 3 минуты
+1: Кому лень гуглить
2
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
07.02.2017, 22:17  [ТС] 13
IamRain, а если не статические экземпляры структуры, а локальные, внутри метода main
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
using System;
 
namespace ConsoleApplication1
{
    struct Guids
    {
        public Guid guidRef { get; set; }
        public Guids(string str = null)
        {
            guidRef = Guid.NewGuid();
        }
    }
    class Program
    {
 
        static void Main(string[] args)
        {
            Guids guids1 = new Guids("");
            Guids guids2 = new Guids("");
            Console.WriteLine("Начальные данные");
            Console.WriteLine("guids1: {0}", guids1.guidRef);
            Console.WriteLine("guids2: {0}", guids2.guidRef);
            Console.WriteLine("guids1 = guids2");
            guids1 = guids2;
 
            Console.WriteLine("Присвоили новый гуид guids2");
            guids2.guidRef = Guid.NewGuid();
            Console.WriteLine("Результат");
            Console.WriteLine("guids1: {0}", guids1.guidRef);
            Console.WriteLine("guids2: {0}", guids2.guidRef);
 
        }
    }
}
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,711
07.02.2017, 22:22 14
Если время жизни известно, то, most likely, в стеке.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.02.2017, 22:26 15
UseMuse, если вас не устраивает 'скорее всего' и 'most likely', тогда вот ещё и 'typically':
C# 6.0 Language SpecificationInstead of dynamically allocating an object and returning a reference to it, a struct constructor simply returns the struct value itself (typically in a temporary location on the stack), and this value is then copied as necessary.
1
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
08.02.2017, 00:34 16
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

Цитата Сообщение от UseMuse Посмотреть сообщение
Интересует момент со структурой, когда создаются на кучи, а когда в стеке.
Зависит от времени жизни переменной.
Если она будет использоваться недолго и компилятор может статически доказать, что время ее жизни детерминированно, то скорее всего она будет помещена в стек или в регистр.
В остальных случаях — в куче.

Тип значения и тип ссылки
1
08.02.2017, 00:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2017, 00:34
Помогаю со студенческими работами здесь

Размещение объекта в памяти
Возможно ли размещение объекта в заранее выделенной памяти, например в массиве? Тоесть не просто...

Размещение map'а в памяти
Элементы вектора гарантировано размещаются в памяти рядом, в случае списка элементы лежат где...

Размещение в памяти данных
Подскажите отличия,если я читаю данные(вещественные числа) с бинарного файла поэлементно и к...

Размещение элементов в памяти
Добрый день! Подскажите. может ли контейнер STL vector хранить значения типа char (wchar_t)? Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru