В чем преимущество структур?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

В чем преимущество структур?

Сообщение Medveckij 02 фев 2013, 15:00

Всем привет.

В каких ситуациях выгоднее использовать структуры вместо классов? Не совсем понимаю в чем их преимущество. Со сравнением ознакомился и ничего. Одни минусы. Быть Может существуют те редкие ситуации, когда структуры необходимы? Зарание спасибо.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: В чем преимущество структур?

Сообщение Sality 02 фев 2013, 16:21

Я с такими ситуациями не сталкивался.
Аватара пользователя
Sality
Старожил
 
Сообщения: 771
Зарегистрирован: 26 ноя 2011, 15:31
Откуда: Украина

Re: В чем преимущество структур?

Сообщение Medveckij 02 фев 2013, 16:39

Не густо, но и на том спасибо...
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: В чем преимущество структур?

Сообщение seaman 02 фев 2013, 17:36

В структурах хранят простые структуры (сорри за тавтологию) данных (в которых мало данных). Тогда например при передаче структуры в качестве параметра в функцию, обращение к этим данным внутри функции происходит быстрее, т.к. все данные хранятся напрямую в стеке. У классов - передается ссылка на данные. И для доступа к самим данным нужно достать их по ссылке.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: В чем преимущество структур?

Сообщение Medveckij 02 фев 2013, 17:52

seaman писал(а):В структурах хранят простые структуры (сорри за тавтологию) данных (в которых мало данных). Тогда например при передаче структуры в качестве параметра в функцию, обращение к этим данным внутри функции происходит быстрее, т.к. все данные хранятся напрямую в стеке. У классов - передается ссылка на данные. И для доступа к самим данным нужно достать их по ссылке.



Спасибо, стало понятней. Вот откопал кусочек класса с той самой структурой в подтверждение вашим словам.

Синтаксис:
Используется csharp

public struct ModifyingAttribute{
       
        public Attribute attribute;
        public float ratio;
       
        public ModifyingAttribute(Attribute att, float rat)
        {
                attribute = att;
                ratio = rat;
        }      
}




public class ModifyStat : BaseStat {

        private List<ModifyingAttribute> _mods;
       
        private int _modValue;
       
       
       
        public ModifyStat()
        {
                _mods = new List<ModifyingAttribute>();
                _modValue = 0;
        }
       
       
       
       
       
        public void AddModifier(ModifyingAttribute mod)
        {
                _mods.Add(mod);
        }
       
       
       
       
       
        private void CalculateModValue()
        {
                _modValue = 0;
               
                if(_mods.Count > 0)
                        foreach(ModifyingAttribute att in _mods)
                                _modValue += (int) (att.attribute.AdjustedBaseValue * att.ratio);
        }
       
       
       
       
       
        public new int AdjustedBaseValue
        {
                get{ return BaseValue + BuffValue + _modValue; }
        }
       
       
       
       
       
        public void Update()
        {
                CalculateModValue();
        }

       
       
       
       
       
}

 
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: В чем преимущество структур?

Сообщение gturk 03 фев 2013, 04:10

Класс - это ссылочный тип. Это значит что экземпляры класса хранятся в управляемой куче.
Структура - значимый тип. Это значит что экземпляры структур хранятся в стеке
Аватара пользователя
gturk
UNITрон
 
Сообщения: 239
Зарегистрирован: 01 апр 2012, 18:49

Re: В чем преимущество структур?

Сообщение AndreyMust19 03 фев 2013, 09:27

Вообще-то в стеке хранятся только локальные переменные, глобальные хранятся в основной памяти.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: В чем преимущество структур?

Сообщение seaman 03 фев 2013, 09:39

Вообще-то в стеке хранятся только локальные переменные, глобальные хранятся в основной памяти.

Это неверно, точнее не точно. Все параметры, передаваемые в функцию хранятся в стеке. Только сами данные классов хранятся в куче, а в стеке только ссылка на их. А данные структур напрямую передаются в стеке. Тут, кстати, палка о двух концах. Внутри функции доступ к данным переданной структуры производится быстрее. Однако собственно для передачи структуры в функцию ее данные нужно скопировать в стек, что медленнее, чем скопировать одну ссылку на данные.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: В чем преимущество структур?

Сообщение AndreyMust19 03 фев 2013, 21:57

seaman
Все параметры, передаваемые в функцию хранятся в стеке

Ну, они выглядят для функции как локальные переменные, объявленные в заголовке.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: В чем преимущество структур?

Сообщение Sality 04 фев 2013, 00:25

на таких языках как шарп и юнитискрипт без разницы скорости доступа и тд. На фоне общем их "cкорости" такие мелочи как доступ в стек или по ссылке или инициализация класса вобще капля в море. Я думаю тут скорее чем удобнее пользоваться в конкретной ситуации, тем и нужно пользоваться.
Аватара пользователя
Sality
Старожил
 
Сообщения: 771
Зарегистрирован: 26 ноя 2011, 15:31
Откуда: Украина

Re: В чем преимущество структур?

Сообщение Medveckij 04 фев 2013, 04:20

Sality писал(а):на таких языках как шарп и юнитискрипт без разницы скорости доступа и тд. На фоне общем их "cкорости" такие мелочи как доступ в стек или по ссылке или инициализация класса вобще капля в море. Я думаю тут скорее чем удобнее пользоваться в конкретной ситуации, тем и нужно пользоваться.


Смотря Что и Как пишите :)
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: В чем преимущество структур?

Сообщение artk 04 фев 2013, 10:05

Я использую структура как простейшие сборник переменных разных типов.
Например:
Было
Синтаксис:
Используется csharp
public void Init(int _id, string _fileName, string _url, int _version, string _imageURL, int _imageVersion, int _numx, int _numY, string name, string info){

Стало
Синтаксис:
Используется csharp
public void Init(DLCOptions _DLCOptions){
            if(isInit) return;
            id              = _DLCOptions.id;
            fileName        = _DLCOptions.fileName;
            url             = _DLCOptions.url;
            Version         = _DLCOptions.Version;
            imageURL        = _DLCOptions.imageURL;
            ImageVersion    = _DLCOptions.ImageVersion;
            image_numFramesX = _DLCOptions.image_numFramesX;
            image_numFramesY = _DLCOptions.image_numFramesY;
            name            = _DLCOptions.name;
            info            = _DLCOptions.info;
            dowloadProgress = 0.1f;
            isInit          = true;
        }
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: В чем преимущество структур?

Сообщение Medveckij 04 фев 2013, 10:10

artk писал(а):Я использую структура как простейшие сборник переменных разных типов.
Например:
Было
Синтаксис:
Используется csharp
public void Init(int _id, string _fileName, string _url, int _version, string _imageURL, int _imageVersion, int _numx, int _numY, string name, string info){

Стало
Синтаксис:
Используется csharp
public void Init(DLCOptions _DLCOptions){
            if(isInit) return;
            id              = _DLCOptions.id;
            fileName        = _DLCOptions.fileName;
            url             = _DLCOptions.url;
            Version         = _DLCOptions.Version;
            imageURL        = _DLCOptions.imageURL;
            ImageVersion    = _DLCOptions.ImageVersion;
            image_numFramesX = _DLCOptions.image_numFramesX;
            image_numFramesY = _DLCOptions.image_numFramesY;
            name            = _DLCOptions.name;
            info            = _DLCOptions.info;
            dowloadProgress = 0.1f;
            isInit          = true;
        }



Вот-вот, я вот тоже потихонечку допер, что это очень и очень удобно. А потом ведь можно целые структуры заливать в тотже массив.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: В чем преимущество структур?

Сообщение Sef 04 фев 2013, 11:42

мульён экземпляров классов после удаления на них ссылок будут удалены из памяти в неизвестное время сборщиком мусора.
мульён экземпляров структур будут удалены из памяти сразу после выхода из { } (как переменная).

По этому Vector3 - структура ;)
Аватара пользователя
Sef
Старожил
 
Сообщения: 595
Зарегистрирован: 29 окт 2009, 13:24
  • ICQ

Re: В чем преимущество структур?

Сообщение Medveckij 04 фев 2013, 12:05

Sef писал(а):мульён экземпляров классов после удаления на них ссылок будут удалены из памяти в неизвестное время сборщиком мусора.
мульён экземпляров структур будут удалены из памяти сразу после выхода из { } (как переменная).

По этому Vector3 - структура ;)


Спасибо, познавательно :)
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 17